Oppure

Loading
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

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
16/01/14 15:54
Dice
RAGAZZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...

HO RISOLTOOOOOOOOOOO!!!!!

Alla fine ho fatto così:

public class Dado
{
private int risultato; //risultato del lancio del dado
//istanzio un oggetto di tipo random
private Random rnd;

//costruttore
public Dado()
{
this.rnd = new Random();
}
//proprietà per far ritornare il risultato del lancio del dado
public int Risultato
{
get { return risultato = this.rnd.Next(1, 7); }
}

E ci sono riuscito ;)

GRAZIE MILLE A TUTTI QUANTIIIIII !!!! :)
aaa
16/01/14 20:25
tuttodiMC
Bravo buona soluzione, non ci avrei mai pensato.
aaa