Cheatah: srand()

Beitrag lesen

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