Random zugehörigkeit

  • BugFix , many thanks an dich, ich konnt dein beispiel super mit meinem code verbinden und jetzt klappt es super...

    @Alle hab wieder ne frage:

    Und zwar, wie verhindere ich, das random wert nochmal genommen wird

    • Offizieller Beitrag

    Und zwar, wie verhindere ich, das random wert nochmal genommen wird

    z.B. so:

    [autoit]

    ; Bsp. 5 Zufallszahlen aus 1 bis 40, keine doppelt
    Local $aRandom[40]
    For $i = 1 To 40
    $aRandom[$i-1] = $i
    Next

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

    $count = 0
    $sRandom = ''
    Do
    $random = Random(0, 39, 1) ; Index des Array mit den Werten 1 bis 40
    If $aRandom[$random] > 0 Then
    $sRandom &= $aRandom[$random] & ';'
    $aRandom[$random] = 0
    $count += 1
    EndIf
    Until $count = 5

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

    ConsoleWrite(StringTrimRight($sRandom, 1) & @CRLF)

    [/autoit]
    • Offizieller Beitrag

    Und so wäre die Anzahl der Schleifendurchläufe immer gleich:

    [autoit]


    Local $aRandom[40]
    For $i = 1 To 40
    $aRandom[$i - 1] = $i
    Next
    $sRandom = ''
    For $i = 0 To 4
    $random = Random(0, 39 - $i, 1)
    $sRandom &= $aRandom[$random] & ';'
    $aRandom[$random] = $aRandom[39 - $i]
    Next

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

    ConsoleWrite(StringTrimRight($sRandom, 1) & @CRLF)

    [/autoit]
  • Gut... danke für die antworten ^^ ich werde mal versuchen, es zu verstehen.

    Und wie ich es einbauen soll weiß ich auch noch nicht mal sehen

  • Ok, also ehrlich gesagt, versteh ich den code net... wieso kommt keine zahl doppelt vor?

    und geht das auch mit allen? also mit den 40?

    Vielleicht kann mir ja jemand helfen

    • Offizieller Beitrag

    Ok, also ehrlich gesagt, versteh ich den code net... wieso kommt keine zahl doppelt vor?

    Das Prinzip ist Folgendes:
    Es wird ein Array erstellt und gefüllt mit allen Zahlen aus dem Bereich, den du für die Zufallszahlen möchtest.
    Per Random wird jetzt aber nicht die Zahl selbst, sondern ein Indexwert für das Array ermittelt.
    Bsp. erster Random-Wert (aus 0 bis 39) ist 9 -- an Index 9 steht im Array die 10
    Nun wird der letzte Wert aus dem Array an die Indexposition 9 geschrieben (also steht dort jetzt 40).
    Im nächsten Durchlauf wird nur noch ein Random aus 0 bis 38 gezogen, da Indexwert 39 ja umgezogen ist auf 'Platz' 9 und somit die 39 'leer' ist.
    Und so wird in jeder Runde weiter verfahren. Dadurch kannst du auch alle Zahlen aus dem Array 'ziehen'. Der letzte Durchlauf wäre dann: Random aus 0 bis 0 ==> also Index 0.

    Edit:

    Ich habs dir mal in eine Funktion gepackt, dann kannst du es universell einsetzen:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

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

    ; 5 Zahlen aus 1-40 als Array
    $ret = _RandomExt(40, 1, 5, 1)
    _ArrayDisplay($ret)

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

    ; alle aus 1-40 als Array
    $ret = _RandomExt(40, 1, -1, 1)
    _ArrayDisplay($ret)

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

    ; 5 Zahlen aus 1-40 als String
    ConsoleWrite(_RandomExt(40, 1, 5) & @CRLF)

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

    ; alle Zahlen aus 1-40 als String
    ConsoleWrite(_RandomExt(40) & @CRLF)

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

    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

    [/autoit]
  • ich verstehs leider immer noch nicht tut mir leid :(

    danke das ihr euch so bemüht. vlt könnt ihr es mir nochmal erklären

    Einmal editiert, zuletzt von razor09 (18. August 2009 um 18:07)

  • also ich hab mir das jetzt ein paar tage angeschaut und versucht zu verstehen... aber ich verstehs trotzdem nicht (trtzdem vielen dank für das Bild und die damit verbundene mühe)

    abgesehen davon weiß ich auch nicht, wie ich das in mein skript einbauen soll

  • Hallo,

    Zitat

    und versucht zu verstehen... aber ich verstehs trotzdem nicht

    Überhaupt kein Problem, dann versuche ich es mal mit einer Erklärung^^
    Stell dir vor du hast einen Topf (Array) mit nummerierten Kugeln (Arrayitems) von 1-7.
    Du ziehst nun zufällig (random) eine Kugel ((Arrayitem), sagen wir die 5 und legst sie aus dem Topf (Array).
    Im Topf (Array) sind nun alle Kugeln ausser der 5. Du kannst nun in den Topf (Array) gucken und eine weitere Kugel ziehen, und zwar alle bis auf die 5, denn die ist nicht mehr im Topf (Array), soweit klar?
    Je mehr Kugeln du aus dem Topf (Array) "ziehst", desto leerer wird der Topf ( das Array). Wenn die letzte Kugel gezogen ist, dann ist der Topf (das Array) leer.

    Zitat

    wieso kommt keine zahl doppelt vor? und geht das auch mit allen? also mit den 40?

    Egal wie viele Kugeln im Topf sind, wenn du eine rausnimmst, ist eine weniger drin^^

    BugFix hat dir eine sehr elegante Lösung gezeigt.
    Man könnte es (einfacher) auch so machen:

    Code
    do
    Ziehe eine zufällige Zahl aus dem Array
    Wenn diese Zahl nicht -1 ist, dann ersetze die gezogene Zahl im Array durch  -1 und erhöhe einen Zähler um 1 
    Ziehe eine zufällige Zahl aus dem Array
    Wenn diese Zahl nicht -1 ist, dann ersetze die gezogene Zahl im Array durch  -1 und erhöhe einen Zähler um 1 
    Ziehe eine zufällige Zahl aus dem Array
    Wenn diese Zahl nicht -1 ist, dann ersetze die gezogene Zahl im Array durch  -1 und erhöhe einen Zähler um 1 
    usw usf
    ...Wenn alle Zahlen gezogen sind (Zähler ist so groß wie die Anzahl aller Zahlen) dann Ende
    loop


    Das "Problem" dabei ist, daß je mehr Zahlen aus dem Array durch -1 ersetzt werden, die Wahrscheinlichkeit immer höher wird, eine -1 zu erwischen statt einer regulären Zahl!
    Am Ende brauchst du sehr viele Versuche, um KEINE -1 zu ziehen.....denn im Array sind nur noch sehr wenige reguläre Zahlen.
    Bis hierhin alles klar?

    BugFix löst dieses Problem jetzt, indem er die "gezogene" Zahl nicht mit -1 ersetzt, sondern mit der letzten Zahl im Array!
    Gleichzeitig wird die Anzahl der zu ziehenden Zahlen um 1 verringert, es fehlt ja eine Zahl im Array, die gezogene. Wenn vorher 40 Zahlen im Array waren, dann sind jetzt nur noch 39 drin. Also ziehen wir auch nur aus diesen 39 Zahlen mit Random eine neue...
    Diese gezogene Zahl wird aus dem Array entfernt und mit der letzen Zahl (der 39.) ersetzt. Bleiben also nur noch 38 Zahlen, Random aus 38, ziehen, mit der letzten (38. Zahl) ersetzen, ziehen, ersetzen uswusf
    Irgendwann sind alle Zahlen gezogen, jede nur ein Mal!

    ciao
    Andy

  • Ok, ich glaube ich habs verstanden, danke für eure Geduld ^^
    werd mich dann mal dran setzten das bei mir einzubauen