srand
Imposta il seme del generatore di numeri casuali per
l'operatore rand.
Lo scopo della funzione è seminare ["to seed" in iglese, NdT]
la funzione rand affinché possa produrre una sequenza
diversa ogni volta che lanciate il vostro programma.
Se srand() non viene chiamata esplicitamente, verrà
chiamata implicitamente la prima volta che viene usato
rand. Comunque, questo non era il comportamento delle versioni
di Perl precedenti alla 5.004, quindi se il vostro script
si avvale di una vecchia versione dell'interprete, dovrebbe
chiamare srand.
La maggior parte dei programmi non chiameranno affatto
srand(), fatta eccezione per quelli che hanno bisogno di
un punto di partenza crittograficamente robusto
anziché quello di default, il quale basato sull'ora, l'ID del processo,
l'allocazione di memoria o il device /dev se disponibile, è
generalmente accettabile.
Potete chiamare srand($seme) con lo stesso $seme per
riottenere la medesima sequenza da rand(), ma di solito
questo si fa esclusivamente per generare risultati
prevedibili, per fare test o debugging.
Altrimenti, non chiamate srand() più di una volta
nei vostri programmi.
Non chiamate srand() (vale a dire, non chiamatela senza
argomenti) più di una volta in uno script. Lo
stato interno del generatore di numeri casuali dovrebbe
contenere più entropia di quella che può essere
fornita da qualunque seme, quindi chiamare srand()
un'altra volta di fatto causa una perdita di
casualità.
La maggior parte delle implementazioni di srand
prendono un intero e troncheranno la parte decimale
senza dire nulla. Questo significa che srand(42)
produrrà di solito gli stessi risultati di
srand(42.1). Per andare sul sicuro, passate sempre
a srand valori interi.
Nelle versioni di Perl precedenti alla 5.004, il seme di
default era solo il valore corrente di time.
Non si tratta di un seme particolarmente buono, quindi
molti vecchi programmi forniscono un loro personale
valore per il seme (spesso time ^ $$ oppure
time ^ ($$ + ($$ << 15))), ma questo non è
più necessario.
Comunque, per ragioni crittografiche, vi serve qualcosa
di più casuale del seme di default.
Costruire un checksum dell'output compresso di uno o
più programmi che monitorano uno stato del
sistema operativo che cambia di frequente è il
modo che viene usato di solito. Ad esempio:
srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
Se tenete particolarmente a questo aspetto, date un'occhiata
al modulo Math::TrulyRandom su CPAN.
I programmi (come gli script CGI) che vengono usati frequentemente e che fanno uso di
time ^ $$
possono cadere preda della proprietà matematica che
a^b == (a+1)^(b+1)
un terzo delle volte. Quindi non fatelo.