16/01/14 11:03
ZioCrocifisso
Postato originariamente da tuttodiMC:
Potresti provare a creare tu un generatore di numeri pseudocasuali in modo da gestire meglio il tutto.
Per esempio potresti provare una cosa simile
Ma mettendo al posto di quel 6 una variabile di un ciclo for che viene incrementata in continuazione, in questo modo avrai per forza numeri diversi.
Potresti provare a creare tu un generatore di numeri pseudocasuali in modo da gestire meglio il tutto.
Per esempio potresti provare una cosa simile
risultato = rnd.Next(1,101) % 6;
Ma mettendo al posto di quel 6 una variabile di un ciclo for che viene incrementata in continuazione, in questo modo avrai per forza numeri diversi.
Non c'è bisogno di fare tutto ciò, perché, come dico dal primo post, Random genera una sequenza di numeri pseudocasuali. Basta un solo Random con qualunque seme, esso potrà generare numeri pseudocasuali in qualunque momento. Facendo come ha fatto lui e come stai facendo tu, Random viene usato male, perché si prende solo il primo numero da diversi Random (creati nello stesso istante nel caso del suo programma, e quindi con lo stesso seme).
Per fare un esempio, un PRNG (generatore di numeri pseudocasuali) molto semplice è lo LCG (non è quello usato da .NET), la cui formula è (a*x+c)%m, dove a, c ed m sono costanti a piacere (da cui dipende l'efficienza dell'algoritmo), e x è il numero precedentemente generato. Scegliendo per esempio le costanti usate da glibc, e come seme (che è il primo x) 1389869749 (tempo UNIX):
> lcg' 1389869749 1572590922 > lcg' 1572590922 3845295291 > lcg' 3845295291 1359549912 > lcg' 1359549912 43404593
Dunque, con lo stesso seed verrà generata la stessa sequenza.
Scegliendo un seed simile (UNIX time qualche secondo dopo):
> lcg' 1389869760 826356729 > lcg' 826356729 1110388542 > lcg' 1110388542 3597676959
(per fare questi esempi ho usato Haskell e GHCi, ma non importa, ho semplicemente fatto una funzione con la formula dello LCG)
I numeri sono dunque completamente diversi, dunque scegliendo ogni volta un seed diverso (come ha fatto Ultimo) effettivamente funziona, ma non è realmente necessario (è complicato e fa rallentare il programma per via degli sleep), visto che, come si può vedere in entrambi casi, basta un primo seed per generare poi numeri diversi. Quello che viene fatto alla creazione di Random() è scegliere come seed il tempo, mentre Next utilizza la formula (non questa, ma il concetto è lo stesso) per ottenere il prossimo numero in base al seed (se è il primo numero) o al numero generato precedentemente.
aaa