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
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
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
$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
ConsoleWrite(StringTrimRight($sRandom, 1) & @CRLF)
[/autoit]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
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
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:
#include <array.au3>
[/autoit] [autoit][/autoit] [autoit]; 5 Zahlen aus 1-40 als Array
$ret = _RandomExt(40, 1, 5, 1)
_ArrayDisplay($ret)
; alle aus 1-40 als Array
$ret = _RandomExt(40, 1, -1, 1)
_ArrayDisplay($ret)
; 5 Zahlen aus 1-40 als String
ConsoleWrite(_RandomExt(40, 1, 5) & @CRLF)
; alle Zahlen aus 1-40 als String
ConsoleWrite(_RandomExt(40) & @CRLF)
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
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
Ich hab dir mal eine kleine Grafik gemacht, dann wird es hoffentlich klar.
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,
Zitatund 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.
Zitatwieso 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:
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