Hi,
Die Perl-Anweisung 'int(rand b)' erzeugt eine ganze Zahl zwischen 0 und b, [...]
Eine _ganze_ Zahl? Nun, in meiner Perl-Doku steht "Returns a random _fractional_ number greater than or equal to 0 and less than the value of EXPR."
ähm... das sagt perldoc aber vermutlich nicht für int()... ;-)
Damit koennte das +1 also doch die Grenze von b ueberschreiten, naemlich wenn der Returnwert von rand() b-1<x<b ist.
Nein, da die Nachkommastellen abgeschnitten werden, ist tatsächlich ein Wert a<=x<=b gewährleistet. Allerding ist a<x=b relativ selten, so daß wir hier keinen fairen Zufallsgenerator haben. Je größer b-a, desto seltener x=b.
Leider kann mit dieser Funktion auch nur gewährleistet werden, daß sich ein Zufallswert vom _vorherigen_ unterscheidet, nicht aber von allen, siehe auch:
P.S. Uebrigens, Daniel's Problem war eigentlich, alle 20 Zahlen unterschiedlich zu halten.
Genau.
Eine Lösung hierzu wäre in etwa folgendes:
for (my $i=0; $i<$anzahl_werte; $i++) {
my $temp = int(rand($max_rand)) while ($hash{$temp});
$hash{$temp} = 1;
$array[$i] = $temp;
}
Anschließend hat man $anzahl_werte paarweise verschiedene Zufallszahlen in @array. Problem: Je höher die Anzahl der Werte und je enger der Zahlenbereich, desto länger (exponential) dauert es.
Cheatah