eine frage bezüglich Random

  • Hallihallo ich wollte mir ein programm schreiben was wir per random die zahlen 1 bis 8 in einer schleife ausgibt. Im prinzip kein problem und des habe ich auch hinbekommen. Nun will ich aber nicht dass nachdem die zahl 1 gekommen ist dass danach die zahl 4 kommt und bei der zahl 2 dass nicht die zahl 5 kommt usw..Ich schreibe mal was nicht darf also 1 und 4; 2 und 5;3 und 6; 7 und 8. Die entgegengesetzten zahlen sollen sich nach 4 maligem wiederholen ich dachte dass es sich am besten in einem array am besten zu bewerkstelligen wäre aber ich kenne ich da leider nicht so gut aus. Ich gebe mal noch ein beispiel wie des aussehen soll und wie nicht Also es soll z.b. 1536 aber nicht 1436 sein weil ja 1 und 4 entgegengesetzt ist wenn das Random dann weitergelaufen ist dann verschwindet die 6 am ende und eine neue zahl soll am anfang erscheinen z.b. die 7 also heißt es 7153.

    SO ich denke dies ist ziemlich verwirrend deswegen scheibe ich es mal soweit hin wie ich es mir gedacht hatte aber ich kenn mich mit arrays gar nicht aus ^^

    Spoiler anzeigen
    [autoit]


    While 1
    $random = Random (1,8,1)
    If $random = 1 Then
    Msgbox (0,"","$random Ist 1. Die 1 mag die 4 nicht.")
    EndIf
    If $random = 2 Then
    Msgbox (0,"","$random Ist 2. Die 2 mag die 5 nicht.")
    EndIf
    If $random = 3 Then
    Msgbox (0,"","$random Ist 3. Die 3 mag die 6 nicht.")
    EndIf
    If $random = 4 Then
    Msgbox (0,"","$random Ist 4. Die 4 mag die 1 nicht.")
    EndIf
    If $random = 5 Then
    Msgbox (0,"","$random Ist 5. Die 5 mag die 2 nicht.")
    EndIf
    If $random = 6 Then
    Msgbox (0,"","$random Ist 6. Die 6 mag die 3 nicht.")
    EndIf
    If $random = 7 Then
    Msgbox (0,"","$random Ist 7. Die 7 mag die 8 nicht.")
    EndIf
    If $random = 8 Then
    Msgbox (0,"","$random Ist 8. Die 8 mag die 7 nicht.")
    EndIf
    ; Hier weiß ich nicht weiter mit dem Array
    ; es soll ja die zahl die eben ausgegeben wurde speichern
    ; und eben verhindern dass random die entgegengesetzte zahl nach
    ; 4 maligem wiederholen der ziffernfolge zurückgibt.
    Wend

    [/autoit]

    Ich bedank mich schon mal für die antworten ;)

    Einmal editiert, zuletzt von Pecadis (10. Januar 2009 um 18:08)

  • Hi,
    so?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $test = generaterandom(10)
    _ArrayDisplay($test)

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

    Func generaterandom($anzahl)
    Dim $random[4]
    Dim $randomarray[1]

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

    For $i = 1 To $anzahl
    $random[0] = Random(1, 8, 1)

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

    For $j = 1 To 3
    Do
    $random[$j] = Random(1, 8, 1)
    Until $random[$j] <> _entgegen($random[$j - 1])
    Next
    ;~ _ArrayDisplay($random)
    _ArrayAdd($randomarray, $random[0] & $random[1] & $random[2] & $random[3])
    Next
    $randomarray[0] = UBound($randomarray) - 1

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

    Return $randomarray
    EndFunc ;==>generaterandom

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

    Func _entgegen($zahl)
    If $zahl = 7 Then Return 8
    If $zahl = 8 Then Return 7

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

    If $zahl > 3 Then
    Return $zahl - 3
    Else
    Return $zahl + 3
    EndIf
    EndFunc ;==>_entgegen

    [/autoit]

    Darf man fragen für was man sowas braucht :P?

    Einmal editiert, zuletzt von anno2008 (10. Januar 2009 um 14:51)

  • Ich glaube der meint das so ungefähr ;)

    Spoiler anzeigen
    [autoit]

    Global $Random = ""
    Global $Zahlen = "1:4,2:5,3:6,7:8"
    For $i = 1 To 8
    Do
    $rdmn = Random(1, 8, 1)
    Until Not StringInStr($Zahlen, StringRight($Random, 1) & ":" & $rdmn) And Not StringInStr($Random, $rdmn)
    $Random &= $rdmn
    Next

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

    MsgBox(0, "", $Random) ;zeigt alles an

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

    For $i = 1 To 8 ;zeigt alle einzeln an
    MsgBox(0, "", StringMid($Random, $i, 1))
    Next

    [/autoit]

    Aber keine Ahnung, am Anfang erzählst du etwas von 1-8 ausgeben und später ist das Ganze nur noch 4-stellig :P. Bitte erkläre das nochmal etwas besser ;).

  • Nein, ich glaub er mein, dass er eine 4-Stellige Randomzahl haben will.

    Allerdings soll die ein Paar Kriterien erfüllen.

    Wenn zum Beispiel bei der 1. Zahl bei Random 1 rausgekommen ist, dann darf die 2. Zahl, die durch Random ermittelt wird nicht 4 sein.

    Und so soll das bis zum Ende durchlaufen werden.

    Zum Beispiel:

    1. Zahl wird durch Random ermittelt und ist: 1
    2. Zahl wird durch Random ermittelt und darf nicht 4 sein. Also soll er solange Random machen, bis die 2. Zahl <> 4 ist. Da kommt jetzt z.B. 3 raus.
    3. Zahl wird durch Random ermittelt und darf nicht 6 sein. Also soll er solange Random machen, bis die 3. Zahl <> 6 ist.

    usw...

    Ich hoffe ich hab das richtig verstanden, ich bin mir auch nicht 100%ig sicher, dass ich keiner Fehler gemacht habe in meinem Programm, aber jetzt habe ich keine Zeit mehr...

  • Genau Anno. Aber dann läuft es weiter und eine neue Zahl wird vorne gebildet und die letzte fällt weg. Das stimmt ja dann so nicht ganz bei dir.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $Anzahl = 10 ; Anzahl der Zahlen
    Global $Random[$Anzahl + 1], $rdmnall = ""
    Global $Zahlen = "1:4,2:5,3:6,7:8"
    For $i = 1 To 4
    Do
    $rdmn = Random(1, 8, 1)
    Until Not StringInStr($Zahlen, StringRight($Random, 1) & ":" & $rdmn) And Not StringInStr($Random[1], $rdmn)
    $Random[1] &= $rdmn
    Next
    For $j = 2 To $Anzahl
    Do
    $rdmn = Random(1, 8, 1)
    Until Not StringInStr($Zahlen, $rdmn & ":" & StringLeft($Random[$j - 1], 1)) And Not StringInStr(StringTrimRight($Random[$j - 1], 1), $rdmn)
    $Random[$j] = $rdmn & StringTrimRight($Random[$j - 1], 1)
    Next

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

    _ArrayDisplay($Random)

    [/autoit]
  • Aber dann läuft es weiter und eine neue Zahl wird vorne gebildet und die letzte fällt weg. Das stimmt ja dann so nicht ganz bei dir.

    Das versteh ich jetzt nicht so genau.
    Welche letzte fällt weg?

    Zitat von Pecadis

    entgegengesetzten zahlen sollen sich nach 4 maligem wiederholen

    Ich denke mal, dass ist das, was du meinst, aber ich verstehe nicht was damit gemein ist :P.

  • Also anno Jain
    ich meinte es so dass eine einstellige randomzahl ausgegeben wird die aber nicht sich selbst und ihre entsprechende "gegnerzahl" entspricht. Ich hatte mir ein paar gedanken zu meiner frage gemacht und bin zu dem schluss gekommen dass es mir zu wenige möglichkeiten bietet wenn ich 4 zahlen im aary behalte deswegenvermidere ich dies auf 3

    ne kurze anleitung wie ich es meinte

    1. die erste zahl wird generiert z.b. 1 diese wird als msgbox angezeigt und im array gespeichert.
    2. die 2. zahl wird ermittelt aber darf nicht 1 oder 4 sein. z.b. 2 auch die 2 wird als msgbox angezeigt und im array gespeichert ( im array sind nun die zahlen 1 und 2)
    3. die dritte zahl wird ebenfalls ermittelt und darf aber nicht 1 und 2 bzw. 4 und 5 betragen wir sagen einfach es wird die zahl 3 ermittelt. wie scon vorher wird auch diese als msgbox angezeigt(im array sind 1,2 und 3)
    4. Jetzt kommt was wichtiges und zwar dass die erste zahl ( 1 ) gelöscht wird und ebenfalls eine neue zahl generiert wird die aber 1, 4, 7 oder 8 sein kann aber nicht 2, 5, 3 oder 6. sagen wir es wird die 7 und auch dies wird im array vermerkt ( nun sind da die zahlen 2,3 und 7 drin) (logisch die ermittelte zahl wird angezeigt)
    5. der 4. schritt wird einfach bis in die unendlichkeit wiederholt.


    Also ich hoffe dass des eine bessere erläuterung ist ^^


    ach herrje schreibe ich langsam :D :D :D :D

  • ja soll für mich da zum üben sein also z.b. wenn die 1 kommt dass ich dann ne frage bekomme und wenn ich sie dann richtig hab dass ich dann ne antwort bekomme (ist ned so schwierig) aber dann soll sich diese frage nicht x mal wieder holen und auch keine ähnliche frage kommen (gegenzahl). ja ich hätt auch zahl 1 und 2 als gegenzahlen definieren können aber naja ^^

  • :P Etwas konfus :D

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Dim $Zahlen[5] = ["", "14", "25", "36", "78"], $Zahl[5]
    Global $Random = "", $rndmall = ""
    For $i = 1 To 3
    Do
    $rndm = Random(1, 4, 1)
    Until Not StringInStr($rndmall, $rndm)
    $rndmzahl = Random(1, 2, 1)
    $Zahl[$i] &= StringMid($Zahlen[$rndm], $rndmzahl, 1)
    $rndmall &= $rndm
    MsgBox(0, "", "Zahl" & $i & ": " & $Zahl[$i])
    Next
    MsgBox(0, "", "Zahlen: " & $Zahl[1] & $Zahl[2] & $Zahl[3])
    While True
    $Zahl[1] = $Zahl[2]
    $Zahl[2] = $Zahl[3]
    $rndmall = StringTrimLeft($rndmall, 1)
    Do
    $rndm = Random(1, 4, 1)
    Until Not StringInStr($rndmall, $rndm)
    $rndmzahl = Random(1, 2, 1)
    $Zahl[3] = StringMid($Zahlen[$rndm], $rndmzahl, 1)
    $rndmall &= $rndm
    MsgBox(0, "", "Neue Zahl: " & $Zahl[3] & @CRLF & "Zahlen: " & $Zahl[1] & $Zahl[2] & $Zahl[3])
    WEnd

    [/autoit]
    • Offizieller Beitrag

    Also wenn du aus einem Pool an Fragen zufällig welche auswählen möchtest, ohne Wiederholungen, dann gibt es eine viel einfachere Methode: Du hast Fragen und Antworten in einem Array ([$i][0]=Frage, [$i][1]=Antwort). Du erstellst ein zweites Array, das nur die Indexzahlen des Frage/Antwort-Arrays enthält, den gezogenen Wert löscht du dann einfach aus dem Array.
    Hier mal ein Bsp.:

    Edit: Hab das Bsp. nochmal verändert, mit Frage-Antwort. Läuft solange, bis alle Fragen richtig beantwortet sind oder 'ENDE' als Antwort gegeben wird.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Global $aFragen[10][2] = [ _
    ['Frage1','Antwort1'], _
    ['Frage2','Antwort2'], _
    ['Frage3','Antwort3'], _
    ['Frage4','Antwort4'], _
    ['Frage5','Antwort5'], _
    ['Frage6','Antwort6'], _
    ['Frage7','Antwort7'], _
    ['Frage8','Antwort8'], _
    ['Frage9','Antwort9'], _
    ['Frage10','Antwort10']]

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

    Global $aIndex[10] = [0,1,2,3,4,5,6,7,8,9]

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

    While IsArray($aIndex)
    Local $index = _GetRandom()
    Local $in = InputBox('Frage [Beenden mit: ENDE]', $aFragen[$aIndex[$index]][0])
    If $in = 'ENDE' Then ExitLoop
    If $in = $aFragen[$aIndex[$index]][1] Then
    If UBound($aIndex) = 1 Then
    MsgBox(0, 'Richtig', 'ENDE - Das wars')
    Else
    MsgBox(0, 'Richtig', 'Und weiter gehts')
    EndIf
    _ArrayDelete($aIndex, $index)
    Else
    MsgBox(0, 'Falsch', 'Und weiter gehts')
    EndIf
    WEnd

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

    Func _GetRandom()
    Return Random(0,UBound($aIndex)-1,1)
    EndFunc

    [/autoit]
  • an sich stimmt das schon aber ich habe im pool auch fragen die sich gegenseitig beantworten also z.b. es kommt die frage : Wann ist im jahre xyz mit der Herrschaftsfamilie in england passiert. es soll dann nicht as nächste frage kommen wann ist die königin xy von england gestorben.
    also so dachte ich es mir zumindest.

    aber des von Blubbstar trifft es ins schwarze ^^ ich danke dir

    also ich denke des kann nun geclosed werden ^^