Zufall aus Array ohne Wiederholung?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zufall aus Array ohne Wiederholung?

    Hallo

    Ich habe ein Array mit 4 String. Diese entsprechen 4 Bilder.
    Aus diesem Array soll per Zufall eines ausgewählt werden.

    Ich habe einen userScore der über und Button, rauf und runter gesetzt wird.
    Jedesmal wird auch über Int.random(in: 0..<4) eine zufällige Zahl generiert, die dann auch dafür sorgt das die entsprechende View neu geladen wird und ein neues Bild angezeigt wird.

    Jetzt besteht das Array aber nur aus 4 Elemente und daher kommt es oft zu Wiederholungen.

    Wie kann ich das am besten lösen, das es ausgeschlossen wird, das die vorherige Zahl noch einmal ausgewählt wird?
    Hat da jemand einen Tipp für mich?
  • mrMo schrieb:

    Du kannst dir die letzte Zahl merken und nach der Ermittlung der Zufallszahl prüfen ob diese identisch sind. Falls ja, das ganze so lange von vorne bis die Zahl anders ist.
    Nur die letzte Zahl merken, reicht nicht. Du müsstest ein "Ergebnis-Array" mit den gezogenen Elementen (oder deren Index) führen, sonst könnte z. B. der 3. Zug das Element des 1. ergeben. Oder man realisiert - wie oben genannt - "auswählen ohne Zurücklegen" wörtlich und entfernt das ausgewählte Element aus dem Array für den nächsten Zug.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Danke Leute.

    mein Problem ist wirklich nur das nicht wenn zufällig 3 ausgewählt wird, nicht noch mal 3 als nächstes kommt.
    Es geht darum das ein Kind 4 Symbole lernen soll.
    Mehr zur Hilfe wird dann mittels Daumen rauf und runter ein Punktescore gespeichert.
    Ich will dazu die Auswahl des nächsten zufälligen Bildes mit abgabe der Bewertung auslösen.
    In der aktuellen version sind es nur 4 Bilder und daher sehr leicht möglich das genau das gleiche Bild noch mal kommt. Was dem Kind e nicht klar ist, aber es verfälscht den Score (für meinen Geschmack).
    Kommt bild 2, dann bild 3 und dann wieder 2 ist egal.

    Mir ist schon klar das ich überprüfen muss ob die neue Zufallszahl e nicht der alten entspricht.
    Aber mir kommt einfach gerade nicht wie.
    Vielleicht kann jemand meinen "Knoten im Kopf lösen".

    Ich habe versucht mit Google und Co etwas zu finden, da das ja alltäglich sein sollte. Konnte aber nichts beispielhaftes finden.
  • Generiere in einer Schleife so lange eine neue Zahl, bis diese anders ist als die zuletzt verwendete Zahl.

    Quellcode

    1. var lastNumber = 0
    2. func setNewRandomNumber(){
    3. while true {
    4. let i = Int.random(in: 0...3)
    5. if i != lastNumber {
    6. lastNumber = i
    7. break
    8. }
    9. }
    10. }
    11. for _ in 0...100 {
    12. setNewRandomNumber()
    13. print(lastNumber)
    14. }
    Alles anzeigen
  • Oder auch mit einer repeat...while-Schleife ... nur um ein alternatives Sprachkonstrukt in's Spiel zu bringen.

    Quellcode

    1. var lastNumber = 0
    2. func setNewRandomNumber(){
    3. var i = 0
    4. repeat {
    5. i = Int.random(in: 0...3)
    6. } while (i == lastNumber)
    7. lastNumber = i
    8. }
    9. for _ in 0...100 {
    10. setNewRandomNumber()
    11. print(lastNumber)
    12. }
    Alles anzeigen
    Ausserdem finde ich break immer etwas einer strukturierten Programmierung widersprechend (obwohl ich es - wie auch "early returns" teilweise selber benutze.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MyMattes () aus folgendem Grund: Unnötig globale Variable

  • MiSch87AT schrieb:

    mein Problem ist wirklich nur das nicht wenn zufällig 3 ausgewählt wird, nicht noch mal 3 als nächstes kommt.

    Es geht darum das ein Kind 4 Symbole lernen soll.
    Ich habe eine Lösung, die passt aber nicht zum Problem.

    Wie wäre es, wenn du das etwas umdefinierst? Zm einen nimmst 5 Symbole, wovon du nur 4 anzeigst. das 5. ist versteckt. du wählst aus, lässt rätseln, am schluss tauscht du das Symbol gegen das versteckte, sortierst um, wählst aus den 4 sichtbaren aus…

    wie wärs damit?
  • MiSch87AT schrieb:

    Danke Leute.

    mein Problem ist wirklich nur das nicht wenn zufällig 3 ausgewählt wird, nicht noch mal 3 als nächstes kommt.
    Es geht darum das ein Kind 4 Symbole lernen soll.
    Mehr zur Hilfe wird dann mittels Daumen rauf und runter ein Punktescore gespeichert.
    Ich will dazu die Auswahl des nächsten zufälligen Bildes mit abgabe der Bewertung auslösen.
    In der aktuellen version sind es nur 4 Bilder und daher sehr leicht möglich das genau das gleiche Bild noch mal kommt. Was dem Kind e nicht klar ist, aber es verfälscht den Score (für meinen Geschmack).
    Kommt bild 2, dann bild 3 und dann wieder 2 ist egal.

    Mir ist schon klar das ich überprüfen muss ob die neue Zufallszahl e nicht der alten entspricht.
    Aber mir kommt einfach gerade nicht wie.
    Vielleicht kann jemand meinen "Knoten im Kopf lösen".

    Ich habe versucht mit Google und Co etwas zu finden, da das ja alltäglich sein sollte. Konnte aber nichts beispielhaftes finden.
    Nur mal so am Rande ein Hinweis.

    Dies ist eine typische Aufgabe aus dem Bereich der Stochastik. Da gibt es einige tolle mathematische Modelle inkl. Sourcecode. Beim Fraunhofer Institut sind da auch gute Abhandlungen zu finden. Einfach mal im Internet recherchieren mit den Stichworten: Mathematik, Stochastik, Wahrscheinlichkeitsrechnungen und Sourcecode.

    Die meisten Lösungen sind in C umgesetzt - sollten jedoch leicht an Swift anzupassen sein.

    Die programmtechnischen Ansätze wurden Dir ja bereits hier mitgeteilt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OSXDev ()

  • Paul___Paul schrieb:

    Ok, dann würde ich halt einfach eine If schleife einbauen
    Das Sprachkonstrukt einer If-Schleife keine ich nicht ... aber oben finden sich ja entsprechende Lösungen. Tut mir leid, wenn das jetzt oberlehrerhaft oder kleinkariert rüberkommt, aber bei Problemen offensichtlicher Anfänger sollte man m. E. auf richtige Terminologie achten ... sonst lernen diese Falsches.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Tut mir leid, wenn das jetzt oberlehrerhaft oder kleinkariert rüberkommt [...]
    Kam es...

    MyMattes schrieb:

    Das Sprachkonstrukt einer If-Schleife keine ich nicht ... [...] bei Problemen offensichtlicher Anfänger sollte man m. E. auf richtige Terminologie achten ... sonst lernen diese Falsches.
    Ganz unrecht hast du nicht, trotzdem bin ich des Glaubens, dass er/sie es verstanden hat.
    Doch dann würde ich auch bezweifeln inwiefern das "keine" nicht auch irritierend wirkt.

    Sorry @MiSch87AT für die Unterbrechung...

    Liebe Grüße
    Paul
  • Wenn die Aufgabe so aussieht, wie ich es verstanden habe, gibt es eine ganz einfache Lösung:
    Du erzeugst eine (Pseudo)-Zufallszahl — allerdings mit den Grenzen 1 und 3 (bei vier Wahlmöglichkeiten).
    Die addierst du dann zur vorangegangenen Wahl, teilst durch 4 und nimmst den Rest.
    So ist ausgeschlossen, dass ein Element zweimal direkt nacheinander ausgewählt wird, und man riskiert auch keine Endlosschleifen ;)