Random

  • Moin,
    ich brauche einen Befehl, der mir 20 Zufallszahlen zwischen eins und 20 erstellt, dabei darf jede Zahl nur einmal vorkommen.
    Es sollen also einfach die Zahlen zwischen 1 und 20 in ihrer Reihenfolge gemischt werden.
    Ich hoffe, es kann mir jemand helfen.

  • EDIT: Neu, jetzt getestet:

    [autoit]


    #include <Array.au3>
    Dim $array[20]
    For $i=1 To 20
    Do
    $tempran=Random(1,20,1)
    TrayTip("",$tempran,1)
    Until _ArraySearch($array,$tempran) = -1
    $array[$i-1]=$tempran
    Next
    _ArrayDisplay($array)

    [/autoit]

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

    2 Mal editiert, zuletzt von L3viathan2142 (6. Mai 2009 um 17:51)

  • Das Problem ist nur, dass dieser Prozess extrem lange dauert (mit 6GhZ)

  • Das Problem ist nur, dass dieser Prozess extrem lange dauert (mit 6GhZ)


    dann teste mal das ;)

    Spoiler anzeigen
    [autoit]

    Func _RandomOrder($Min,$Max)
    ; Prog@ndy
    Local $rand
    If $Min > $Max Then
    $rand = $Min
    $Min = $Max
    $Max = $rand
    EndIf
    Local $Array[$Max-$Min+1], $Return[$Max-$Min+1], $maxb=$Max-$Min
    For $i = 0 To $maxb
    $Array[$i] = $Min+$i
    Next
    For $i = 0 To $maxb
    $rand = Random(0,$maxb-$i,1)
    $Return[$i] = $Array[$rand]
    $array[$rand] = $array[$maxb-$i]
    Next
    Return $Return
    EndFunc
    #include<array.au3>
    $array = _RandomOrder(1,20)
    _ArrayDisplay($array)

    [/autoit]
  • Arghh, progandy, jetzt hab ich mich extra 5 Mins an dieses Skript gesetzt (<1 ms):

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    dim $source[20]=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
    dim $dest[20]
    $stamp=TimerInit()
    For $i=0 To 19
    $ran=Random(1,Ubound($source)-1,1)
    $dest[$i]=$source[$ran]
    _ArrayDelete($source,$ran)
    Next
    $time=TimerDiff($stamp)
    _ArrayDisplay($dest)
    MsgBox(0,0,$time)

    [/autoit]


    ... und dann postest du sowas früher... :huh:

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • Ich hab mich nur ein paar Mins früher als du hingesetzt ;) Hab mich an den Lotto µIt erinnert und da war das die beste Lösung ...

  • Kein Ubound und kein Arraydelete... Dann ist es schneller ;)
    Das wird jetzt aber langsam OT ... :P

  • Ich habe es mal so gemacht

    Spoiler anzeigen
    [autoit]

    Dim $Zahl[20] =[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
    For $1 = 0 To 19
    $ran1 = Random (0,19)
    Do
    $ran2 = Random (0,19)
    Until $ran2 <> $ran1
    $temp1 = $Zahl[$Ran1]
    $temp2 = $Zahl[$Ran2]
    $Zahl[$ran1] = $temp2
    $Zahl[$ran2] = $temp1
    Next
    $Zahlen = ""
    For $1 = 0 To 19
    $Zahlen &= $Zahl[$1] & ","
    Next
    MsgBox (0,"",$Zahlen)

    [/autoit]

    Weiß aber nicht wie lange es dauert, wie kann ich das messen?

    mfg. Jam00

  • Mit Arrays komm ich noch nicht so zurecht und ich möchte jetzt jede dieser Zahlen einer Variablen zuweisen, wie kann ich das machen?

    [autoit]

    Dim $Zahl[20] =[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
    For $1 = 0 To 19
    $ran1 = Random (0,19)
    Do
    $ran2 = Random (0,19)
    Until $ran2 <> $ran1
    $temp1 = $Zahl[$Ran1]
    $temp2 = $Zahl[$Ran2]
    $Zahl[$ran1] = $temp2
    $Zahl[$ran2] = $temp1
    Next
    $Zahlen = ""
    For $1 = 0 To 19
    $Zahlen &= $Zahl[$1] & ","
    Next

    [/autoit]