Numeri random con /dev/random
Inviato: giovedì 7 giugno 2007, 22:31
Come faccio da bash ad avere numeri random compresi da 1 a 90 usando /dev/random? No vi devo spiegare per cosa devo usarli vero?
:-[
Il forum della comunità italiana di Ubuntu.
https://forum.ubuntu-it.org/
eh?bite ha scritto: Comunque mi dicono che la smorfia funziona meglio.
Sembra che ricavare numeri pseudo-casuali tra 0 e N usando una funzione casuale rand come dici sia sbagliato :-\bite ha scritto: echo $((1+$RANDOM%90))
Verifica se ad ogni accensione il risultato è diverso
Vediamo, a che potrebbe servirti... a regalare dei soldi allo Stato?
Ti riferisci a questo?Uno ha scritto: Sembra che ricavare numeri pseudo-casuali tra 0 e N usando una funzione casuale rand come dici sia sbagliato :-\
http://www.hwupgrade.it/forum/archive/i ... 96677.html
Vero, ma:Il modo "brutale" per ottenere un numero pseudorandom tra 0 ed N-1 è ovviamente:
val = rand() % N;
Questo metodo viene dato per buono in alcuni manuali, ma contiene almeno due errori concettuali.
Anzitutto, non è detto che la distribuzione di val sia uniforme. Infatti lo standard garantisce che il valore restituito da rand sia uniformemente distribuito tra 0 e RAND_MAX inclusi: ne segue che, se N non è un divisore di RAND_MAX+1, allora la probabilità che val sia 0 è maggiore della probabilità che val sia N-1. (Di quanto, dipende dai valori di N e RAND_MAX.)
Il secondo, e più serio, è che val viene generata usando le cifre meno significative di rand. Ora, se k divide m, allora calcolare la classe resto modulo k della classe resto modulo m di un numero intero qualsiasi, è lo stesso che calcolare direttamente la classe resto modulo k: questo perché, quando si tolgono i multipli di m, si toglie già una parte dei multipli di k. Ne segue che, se rand è congruenziale lineare --- e non si può escludere che lo sia --- di moltiplicatore a, incremento b, e modulo m, e N divide m, allora rand() % N è congruenziale lineare di moltiplicatore a mod N, incremento b mod N, e modulo N: in particolare, il periodo di rand() % N non può superare N.
Il modo per evitare questo secondo inconveniente, è usare sempre tutte le cifre significative di rand: il modo più immediato per farlo, è trasformare il valore fornito da rand in un numero in virgola mobile in doppia precisione, uniformemente distribuito fra 0 incluso e 1 escluso:
double frand(void)
{
return rand() / (RAND_MAX+1.0);
}
Come si può vedere, i valori 4 e 9 si possono ottenere in 3276 casi, contro i 3277 che determinano l'uscita di ciascuno degli altri numeri: di conseguenza, le probabilità di uscita di 4 e 9 sono 3276/32768 1/10. Potrebbe essere una tolleranza accettabile; ma potrebbe anche non esserlo.