Zufallszahl ohne wiederholung

  • hey erstmal,
    Ich hab in letzter Zeit angefangen mit Android Studio, mein erstes Projekt ist eine "quizapp" welche ich mithilfe eines YouTube Tutorials erstellt habe. Das funktioniert jetzt auch alles und ich probiere seit letzter Woche das Quiz zu erweitern. Bis jetzt hat das auch geklappt aber ich bin nun einem Punkt wo ich einfach nicht mehr weiterkomme....
    Bisher werden die Fragen immer in der gleichen Reihenfolge gestellt was natürlich langweilig ist. Meine "idee" war es jetzt also die Fragen zufällig zu Stellen. Dazu habe ich im Internet mich informiert und bin auf das lottoproblem gestossen. Aus einem topf von Zahlen(bei mir die fragen) werden eine bestimmte Anzahl von Kugeln gezogen(soviel wie Fragen gestellt werden) und jede Kugel (also frage) kann nur einmal gestellt werden, weil jede Zahl nur einmal im topf ist. Dazu habe ich auch viele Programme gefunden und ausprobiert aber funktioniert hat es nie.
    https://drive.google.com/open?…l7jqkNo8qOA5kxlWvr6wpLSwm
    Das hier ist ein Teil meines Programmes und in die Funktion frageladen dort wo die Zeile frei ist, müsste nun die funktion(heisst das so?) In welcher die zufahlszahl bestimmt werden würde. In die Zeile darunter in Fragen.get müsste in die Klammer die zufahlszahl. Zurzeit (so funktioniert es auch) steht dort aktuelle Frage, was ich weiter oben mit aktuelle Frage = 0 definiert habe und weiter unten erhöht sich der Wert von aktuelle Frage nach jeder frage um 1.
    Ich habe keine Ahnung ob man versteht was ich meine aber wenn es jemand bis hierhin geschafft hat und meint mir helfen zur können würde ich mich freuen <3

  • hi, ja den Code hier im Forum zu Posten und zwar mit den dafür vorgesehenen Tool </> würde es für uns leichter machen als nur ein Bild.
    Dann zeige uns aber bitte auch die Klasse Fragen.
    Wenn ich es richtig verstehe hast du immer ein Fragen und 4 antworten paar in einer Liste. Nur das du beim Zugriff auf die Liste keinen Index angiebst.
    Dafür musst du auch mit random dir auch eine Zufallzahl holen und dir diese merken dam it die nicht beim nächste mal wiederkommt also die zahl mit der gemerkten vergleichen wenn schon vorhanden den noch mal random.

  • sorry hatte nicht verstanden was du mit <> meinst, hier jetzt also hoffentlich richtig


    mein obenbeschriebenes problem ist in zeile 60.
    hier wäre noch die klasse fragen

    ich hoffe jetzt ist es richtig :D und danke schonmal für deine mühe

  • Dein Problem ist nicht in Zeile 60 sondern in 61. Und zwar wird da in " get() "eine index Wert erwartet. Das kannst du auch in deinem ersten Bild an der roten wellen Linie sehen.
    Aber erstmal zu deiner Fragen Klasse.
    In den Zeilen 69 bis 75 fügst du der Liste Elemente(Fragen) hinzu nur warum gibst du da wieder einen Index wert mit an ? Eigentlich brauchst du keinen Index dazu lasse in Zeile 11 die Anzahl der Elemente weg also die 7.
    Add dann so fragen.add( frage1);
    die Anzahl der Fragen in der Liste kannst du mit size erfragen.



    Inder Haupt Klasse schreibst du dir eine schleife die alle Indexwerte ,die du dir mit size erfragen kanst, per Zufall durchläuft. Denn zufällig erstellten Index gibst du bei get() in Zeile 61 ein.



    um sicher zu stellen das fragen nicht doppelt kommen musst die gestellten Fragen markieren ob sie schon gestellt wurden.

  • Zum markieren der Fragen könntest du die Klasse Fragen erweitern.
    Den String Array einen Eintrag hinzufügen, frage1[5] ist vielleicht 0 wenn Noch nicht gestellt 1 wenn die Frage schon da dran war.
    Dazu brauchst Noch eine eine neue Methode in deine Fragen Klasse.
    Nur das du jetzt nicht mit add arbeiten kannst sondern mit set , set ersetzt den Listen Eintrag am Index ,und add füg hinzu und verschiebt den Rest nach unten.
    Das ist der gleiche Index den du bei Zeile 60 benutzt.


    Inder Main klasse mist du nach dem zufallszahl. Ereichen erst prüfen ob die frage noch nicht gestellt wurde wenn ja dann neue Zufalls zahl. Und am Ende mist du die frage als fertig markieren.


    Hoffe das das Prinzip einigermaßen klar geworfen ist.

  • ok habe gerade gesehen das Du einen anderen weg gehen willst. Den in dem onklick listen tust du deinen Index aktuellefrage um eins erhöhen und willst dann eine neue frage laden.
    Dann wäre es sinnvoller eine un sortierte zufällige Liste zu haben. Dazu müsstest du das erstellen ändernder Liste über Zufall lösen.

  • Danke für deine Kommentare erstmal,
    Dass in der Fragen.add das in der Klammer fehlt war mir schon klar.
    Normal steht in der Klammer dort "aktuelle frage" und ganz oben gebe ich aktuelle frage den Wert 0. Wie du schon gesagt hast erhöhe ich den Wert mit dem onclick nach jeder Frage um 1. Meine Idee war jetzt in Zeile 60, deshalb ist dort auch eine lerrezeile, eine zufallszahl zwischen 1 und 7 (weil ich 7 Fragen hab) zuerstellen. Diese zufallszahl sollte dann in die Klammer, jede Zahl darf aber das es keine Wiederholungen gibt nur einmal vorkommen. Diese Funktion die mir die zufallszahl ohne wiederholung erstellt ist aber mein Problem, da ich das mit dem überprüfen ob die Zahl schon vorgekommen ist nicht hinkriege. Den Index aktuelle Frage wollte ich einfach nur noch in der onclick Methode aufrufen und in der Methode jewels um 1 erhöhen sodass ich wenn 5 Fragen gestellt werden sollen einfach als maximal Wert 5 eingeben kann.
    So war mein Plan zu mindestens :) . Ich war mir jetzt nicht sicher ob du das auchsosiehst? Wenn du das so mit deinen comments gemeint hast sorry, verstehe das in deinem letzten Comment nicht.
    Würdest mir echt helfen wenn du mir einen Lösungsweg in einfachen Worten erklären könntest. Wenn ich jetzt komplett deine Comments ingnoriert habe sorry, aber verliere dort ein bisschen den Überblick, sonst schreib einfach nochmal die nummer in welchem Comment das richtige steht.
    Vielen Dank nochmal für deine Antworten

  • es gibt immer viele Wege die zum Erfolg führen. Habe dir zwei gezeigt.
    Eine Zufall Berechnung die dir keine doppelten Zahlen erstellt gibt es nicht.
    Dazu musst du dir was überlegen.
    1. Alle erzeugten Zahlen zb in einem Array speichern und prüfen ob die Zahl schon vorhanden wenn ja neu Zahl anfordern und wieder prüfen. Bis eine Zahl kommt die noch nicht im Array ist.
    2. Wenn die Liste mit den Fragen nicht immer in der gleichen Reihenfolge ist kannst du mit deinem Code einfach weiter machen. Dazu musst du aber das erstellen der Liste in der Faragen Klasse ändern.
    3. Du könntest schon gestellte Fragen aus der Liste löschen. Wenn die Liste lehr ist ist das spiel zu Ende.
    Beim erstellen der Zufallszahl musst du beachten das die Liste immer kleiner wird und somit auch der Bereich für die Zufallszahlen begrenzt werden muss.

  • Okay danke,
    Ich will eigentlich den ersten Weg weiss aber nicht wie,
    Ich hab das mit ein paar Beispielen aus dem Internet probiert, hab aber das Problem das ich einen Integer Wert brauche und im Internet hab ich nur Int[] Werte gefunden....

  • Mit einer SQL ist es recht einfach du speicherst zu den fragen im gleichen Datensatz ein flag mit . Indem du speicherst ob die frage benutzt wurde. Bei dem auslesen abfragen der db lässt du dir nur fragen geben die noch nicht benutzt wurden. Setz natürlich voraus das du das flag nach benutzen der frage auch setzt.
    Dazu solltest du dir etwas SQL Kenntnisse wenn nicht vorhanden aneignen.

  • Hast du schon mit DB gearbeitet?


    http://www.programmierenlernen…qlite-datenbank-tutorial/


    Für die Zufalls Berechnung könnte das helfen.
    https://www.gutefrage.net/frag…ie-sich-nicht-wiederholen
    http://www.amdtown.com/2P5WBGYN/


    Mit dem ersten link kannst du deine Liste durch schütteln lassen. So das sie jedes mal anders ist,und du einfach der Reihe nach durch gehen kannst.
    Das ist Das was ich mit unsortierter Liste meinte.


    In der Fragen Klasse nach Zeile 75


    Collections.shuffle(fragen);

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!