Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Non devi creare e conservare il risultato di Random, ma l'oggetto Random stesso. Il motivo è che esso non restituisce realmente numeri casuali, ma pseudocasuali, che vengono ottenuti tramite una formula: questa genera una sequenza di numeri in base a un seed, che su Random è il tempo (ma puoi deciderlo tu). Se crei diverse istanze di Random nello stesso istante, queste avranno lo stesso seed e genereranno le stesse sequenze di numeri, e poiché prendi solo il primo numero di quella sequenza (Next, come si può intuire dal nome, prende il prossimo numero), visto che stai usando istanze diverse, sarà sempre lo stesso.
Ultima modifica effettuata da ZioCrocifisso il 15/01/2014 alle 18:09
Hai lasciato i cambiamenti inutili di prima (riguardo al risultato), quindi non so come lo usi adesso LanciaDado. Posta anche il codice con cui lo usi.
Comunque dovresti sforzarti di capire come funziona, invece di chiedere cosa cambiare senza capirci niente, altrimenti riavrai lo stesso problema in futuro.
Per caso quello che sbaglio è che calcolo il risultato del lancio fuori dal costruttore?
Devo mettere anche il calcolo del risultato nel costruttore ed eliminare il metodo LanciaDado?
Come ti è stato detto è normale che ti escano i numeri uguali, perchè i 5 lanci vengono effettuati praticamente
nello stesso istante, quindi il seed(seme) della funzione Random che genera una sequenza pseudocasuale sarà
sempre lo stesso.
Quindi per risolvere il problema o fai trascorrere del tempo tra un lancio e l'altro, oppure nella classe Dado
inserisci un Array che rappresenti le sei facce del Dado, e nel costruttore della classe avvii una procedura
che ne mischia il suo ordine, in modo tale da avere sempre delle sequenze diverse.
Una soluzione semplice:
Codice sorgente - presumibilmente C++
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace APP_Lancio_del_Dado
{
class Program
{
staticvoid Main(string[] args)
{
int risultato1 =0;
int risultato2 =0;
int risultato3 =0;
int risultato4 =0;
int risultato5 =0;
//istanzio un'oggetto della classe Dado
Dado dado =new Dado();
while(true)
{
//lancio i dadi e memorizzo i risultati
risultato1 = dado.LancioDado();
System.Threading.Thread.Sleep(300);
risultato2 = dado.LancioDado();
System.Threading.Thread.Sleep(300);
risultato3 = dado.LancioDado();
System.Threading.Thread.Sleep(300);
risultato4 = dado.LancioDado();
System.Threading.Thread.Sleep(300);
risultato5 = dado.LancioDado();
System.Threading.Thread.Sleep(300);
//stampo i risultati
Console.WriteLine(" Risultato dei 5 Lanci del Dado: ");
Potresti provare a creare tu un generatore di numeri pseudocasuali in modo da gestire meglio il tutto.
Per esempio potresti provare una cosa simile
Codice sorgente - presumibilmente Plain Text
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):
Codice sorgente - presumibilmente Plain Text
> 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):
Codice sorgente - presumibilmente Plain Text
> 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.