Calocybe: srand()

Beitrag lesen

Hi Don!

Ok, soweit hab ich das verstanden. Allerdings fallen mir da ein paar Dinge auf.

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." Damit koennte das +1 also doch die Grenze von b ueberschreiten, naemlich wenn der Returnwert von rand() b-1<x<b ist.

Da wir uns vorher beim Aufruf von rand() einen Wert (b) aufgespart haben, müssen alle Werte größer oder gleich $previous_rand um 1 erhöht werden. Damit werden alle Zahlen x mit a<=x<=b erreicht.

Ausser natuerlich der Bereich previous_rand<=x<pevious_rand+1. Aber wenn nur ganze Zahlen zurueckgeliefert werden wuerden, wuerde sich dieser Bereich auf den einzigen Wert previous_rand selbst beschraenken, was ja von Dir beabsichtigt ist.

Fehler: Ein kleiner Fehler ist allerdings im Script. Es kann beim ersten Aufruf von random() niemals die kleinste gewünschte Zahl (a) erzeugt werden. Dies könnte noch eingefügt werden.

Naja, previous_rand muss sowieso initialisiert werden, warum also nicht auf eine Zahl, die groesser ist, als alle b's, die im Script uebergeben werden sollen (falls vorher bekannt)?

Zusatz: random() funktioniert so nur für positive natürliche Zahlen. Bei negativen Werten wird der Zahlenbereich 'verschoben', kann aber noch korrigiert werden.

Noe, warum? Man muss nur darauf achten, dass a immer kleiner ist als b. Aber das muss man im positiven Bereich sowieso auch tun. Und dran denken: -10 ist kleiner als -4!

Für reelle Werte ist die Funktion gänzlich ungeeignet!

Tja, wie gesagt, rand() liefert eben reelle Werte zurueck.

Calocybe

P.S. Uebrigens, Daniel's Problem war eigentlich, alle 20 Zahlen unterschiedlich zu halten.