Zufallsgenerator Hilfe benötigt

  • Hallo,
    AutoIt hat ja die schöne Funktion random(), jedoch benötige ich einen Zufallsgenerator, welcher jeden Wert ausschließlich einmal generiert, bis jeder Wert vorkam.

    Vielen Dank für eure Unterstützung schon jetzt.

    -Mowgly

  • Moin.

    Laß doch eine Zufallszahl generieren und diese in z.B. Textdatei schreiben. Beim nächsten mal läßt Du wieder eine Zufallszahl generieren und prüfst vorher ob sie schon in der Textdatei steht. Wenn ja, dann noch einmal, wenn nicht wird die Zahl wieder in der Textdatei gespeichert.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

    • Offizieller Beitrag

    Mit einem kleinen Trick sind die Zahlen zufällig, aber jeweils nur einmal vorkommend:

    Spoiler anzeigen
    [autoit]


    $iAnzahl = 20 ; So viele Zufallszahlen sollen erstellt werden
    $iStart = 1 ; Startwert der Zufallszahlen

    [/autoit] [autoit][/autoit] [autoit]

    Dim $aZufallszahlen[$iAnzahl] ; Array mit Zufallszahlen deklarieren

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aZufallszahlen) - 1 ; Array mit den Zahlen füllen
    $aZufallszahlen[$i] = $iStart + $i
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aZufallszahlen) - 1 ; ab hier jetzt die Zufallszahlen ausgeben
    $iZufall = Random(0, UBound($aZufallszahlen) - 1 - $i, 1)
    ConsoleWrite($i + 1 & '. Zufallszahl = ' & $aZufallszahlen[$iZufall] & @CR)
    $aZufallszahlen[$iZufall] = $aZufallszahlen[UBound($aZufallszahlen) - 1 - $i]
    Next

    [/autoit]
  • Danke für eure Antworten und die Methode von Oscar kommt schon nah an das, was ich mir vorgestellt hatte, jedoch werden die Zahlen wieder mehrfach generiert, wenn ich den script in meinen einfüge.
    Hier mal mein Code. Sry, dass es so unstrukturiert ist:

    Spoiler anzeigen
    [autoit]


    $iAnzahl = 31 ; So viele Zufallszahlen sollen erstellt werden
    $iStart = 0 ; Startwert der Zufallszahlen

    [/autoit] [autoit][/autoit] [autoit]

    Dim $aZufallszahlen[$iAnzahl] ; Array mit Zufallszahlen deklarieren

    [/autoit] [autoit][/autoit] [autoit]

    Local $sp[31] ;Array-Anzahl Aktuell halten

    [/autoit] [autoit][/autoit] [autoit]

    $sp[0] = "Guten Morgen!, Guten Tag!"
    $sp[1] = "Hallo!"
    $sp[2] = "der Junge / das Mädchen"
    $sp[3] = "Wie geht´s?"
    $sp[4] = "gut"
    $sp[5] = "und"
    $sp[6] = "du"
    $sp[7] = "und dir?"
    $sp[8] = "ich"
    $sp[9] = "ich bin"
    $sp[10] = "von, aus"
    $sp[11] = "Spanien"
    $sp[12] = "wie?"
    $sp[13] = "du heißt"
    $sp[14] = "Wie heißt du?"
    $sp[15] = "ich heiße"
    $sp[16] = "Tschüss!, Auf Wiedersehen!"
    $sp[17] = "bis"
    $sp[18] = "morgen"
    $sp[19] = "Bis morgen!"
    $sp[20] = "nachher, später"
    $sp[21] = "Bis nachher!, Auf Wiedersehen!"
    $sp[22] = "das Fest, die Party"
    $sp[23] = "der Strand"
    $sp[24] = "der / die Freund/in"
    $sp[25] = "in, auf, an"
    $sp[26] = "die (bestimmter Artikel Plural)"
    $sp[27] = "plaudern"
    $sp[28] = "ein / eine (unbestimmter Artikel Singular)"
    $sp[29] = "der Platz"
    $sp[30] = "he!, was?, wie?"

    [/autoit] [autoit][/autoit] [autoit]

    $varcount = 0

    [/autoit] [autoit][/autoit] [autoit]

    wh()

    [/autoit] [autoit][/autoit] [autoit]

    func wh()
    For $i = 0 To UBound($aZufallszahlen) - 1 ; Array mit den Zahlen füllen
    $aZufallszahlen[$i] = $iStart + $i
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aZufallszahlen) - 1 ; ab hier jetzt die Zufallszahlen ausgeben
    $iZufall = Random(0, UBound($aZufallszahlen) - 1 - $i, 1)
    $varrand = $aZufallszahlen[$iZufall]
    $aZufallszahlen[$iZufall] = $aZufallszahlen[UBound($aZufallszahlen) - 1 - $i]
    Next
    Do
    $varbox = inputbox("Vokabeltraining",$sp[$varrand])
    If $varrand = 0 and $varbox = "!Buenos días!" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win!")
    Elseif $varrand = 30 and $varbox = "!eh!" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 29 and $varbox = "la plaza" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 28 and $varbox = "un / una" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 27 and $varbox = "charlar" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 26 and $varbox = "los / las" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 25 and $varbox = "en" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 24 and $varbox = "el amigo / la amiga" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 23 and $varbox = "la playa" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 22 and $varbox = "la fiesta" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 21 and $varbox = "!Hasta luego!" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 20 and $varbox = "luego" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 19 and $varbox = "!Hasta mañana!" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 18 and $varbox = "mañana" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 17 and $varbox = "hasta" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 16 and $varbox = "!Adiós!" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 15 and $varbox = "me llamo" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 14 and $varbox = "?Cómo te llamas?" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 13 and $varbox = "te llamas" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 12 and $varbox = "?cómo?" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 11 and $varbox = "España" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 10 and $varbox = "de" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 9 and $varbox = "yo soy" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 8 and $varbox = "yo" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 7 and $varbox = "?Y tú?" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 6 and $varbox = "tú" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 5 and $varbox = "y" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 4 and $varbox = "bien" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 3 and $varbox = "?Qué tal?" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win")
    Elseif $varrand = 1 and $varbox = "!Hola!" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win!")
    Elseif $varrand = 2 and $varbox = "el chico / la chica" Then
    $fbutton = msgbox(1,"Vokabeltraining","Win!")
    else
    $fbutton = msgbox(6,"Vokabeltraining","FAIL!!!")
    if $fbutton = 11 Then
    wh()
    EndIf
    EndIf
    $varcount = $varcount + 1
    If $fbutton = 1 Then
    wh()
    ElseIf $fbutton = 2 Then
    Exit
    EndIf
    Until $varcount = 3 or $fbutton = 3 or $fbutton = 2 or $varbox = 1
    EndFunc

    [/autoit]


    Ja, man hätte den gesamten Code bestimmt auch einfacher machen können ohne jede Vokabel im Quelltext, aber erstmal sollte es so bleiben.

    Und jetzt noch eine Frage: Was ist ein "On go" Spiel? :D

    Ps.: an die belegung der Buttons muss ich mich auch nochmal setzen wie ihr seht ;)

    • Offizieller Beitrag

    Ich halte den Ansatz bereits für verkehrt. Wenn Du einen Vokabeltrainer schreiben möchtest, dann würde ich ein 2D-Array benutzen (1. Element = deutsch, 2. Element = Fremdsprache).
    Das spart Dir diese If...Then...ElseIf-"Wüste". Das kann doch keiner mehr nachvollziehen. Vor allem, wenn Du das noch erweitern willst.

    Beschäftige Dich erstmal eingehend mit Arrays (Tutorial von BugFix), dann wird vieles sehr viel einfacher. :)

    • Offizieller Beitrag

    Ich hatte denselben Lösungsweg wie Oscar, auch mal in eine Funktion verpackt. Sollte dir dann einfacher fallen es zu nutzen.
    Mit Parameter $array = 1 wird ein Array zurückgegeben.

    Spoiler anzeigen
    [autoit]

    ;==============================================================================
    ; Gibt eine Anzahl Zufallszahlen ohne Doppel als String oder Array zurück
    ; Bereich von - bis festlegbar (positiv Integer)
    ; mit -1 für Anzahl werden alle Zahlen des Bereichs in zufälliger Reihenfolge
    ; ausgegeben
    ;==============================================================================
    Func _RandomExt($iBis, $iVon=1, $iAnzahl=-1, $array=0)
    Local $count = $iBis -$iVon +1
    If $iAnzahl = -1 Then $iAnzahl = $count
    Local $aValue[$count], $start = $iVon, $sOut = '', $random
    For $i = 0 To $count -1
    $aValue[$i] = $start
    $start += 1
    Next
    For $i = 0 To $iAnzahl -1
    $random = Random(0, $count -1 -$i, 1)
    $sOut &= $aValue[$random] & ','
    $aValue[$random] = $aValue[$count -1 -$i]
    Next
    $sOut = StringTrimRight($sOut, 1)
    If $array Then Return StringSplit($sOut, ',', 2)
    Return $sOut
    EndFunc ;==>_RandomExt

    [/autoit]