On Fri, 23 Aug 2013 23:18:22 +0200, "Mister" <pippo@pippo-com> wrote:
>volendo generare una sequenza casuale "robusta", ad esempio per sistemi di
>gioco, hai qualche consiglio da darmi, sempre rimanendo nell'ambito php?
Bisogna che tu sia piu' preciso. Sequenza casuale di che cosa, e ottenuta
come?
Per sistemi di gioco, ti serve un sistema impredicibile: quindi eviterei,
ad esempio, l'uso di generatori come mt_rand(). E' costosissimo, pero' se
uno ha a disposizione poco piu' di 600 estrazioni consecutive e una bomba
di potenza di calcolo (o una scheda nVIDIA di buon livello :-) ), ti puo'
predire tutte le future estrazioni. mt_rand() va bene ma va "rinfrescato"
di tanto in tanto. In alternativa puoi usare mcrypt in modalita' CTR, con
l'accortezza di preparare i contatori in ingresso con pack() a blocchi, e
poi estrarli nello stesso modo (ci sono due scuole di pensiero. Questa e'
una. L'altra prevede di clonare il contatore fino a riempire il buffer di
AES, cioe' cifrare N volte lo stesso contatore anziche' N diversi).
Una fonte di 'randomness' abbastanza cattiva, ma non performantissima, e'
urandom (anche su Windows):
$binary = mcrypt_create_iv(4, MCRYPT_DEV_URANDOM);
$value = unpack('Ni', $binary);
$value = $value['i'] & 0x7FFFFFFF;
...che ti ritorna un intero, fra 0 e 2^31-1. Se ti serve un valore su un
intervallo, NON fare "$min + $value % ( $max - $min )", che SEMBRA anche
funzionare, ma badaben badaben badaben, non funziona (funziona QUASI: e,
in alcuni casi, magari ti va anche bene... con numeri piu' piccoli, vedi
subito il trucco). Converti $value in float, dividi per 2^31-1, e quello
che risulta lo moltiplichi per ($max-$min) prima di sommare $min - c'e',
anche qui, un piccolo errore: ma e' sparpagliato meglio (thanks, IEEE) e
non saprei neanche da che parte cominciare per rilevarlo.
(Ah, visto che serve un float, verra' anche a voi la tentazione di usare
"fi" al posto di "Ni". E se avete fortuna, la macchina su cui lo fate e'
di quelle che vi mordono subito sul culo. Se avete sfiga, non lo e' - e,
siccome Murphy e' una sicurezza, lo sara' la macchina di produzione. Per
i sordidi dettagli, vedi sul manuale alla voce pack(), e sotto alla 'f':
"machine dependent size and representation". "Qui, funziona... la' no" -
e, quindi, noi siamo i programmatori che dicono 'Ni').
A proposito di casualita' e giochi, beh, anche l'implementazione ti puo'
fregare:
http://www.cigital.com/papers/download/developer_gambling.php
...e io conoscevo un sito che invece usava incautamente mt_rand() <g>.