Domanda

Ho fatto alcuni test per la classe Random e ho usato il seguente codice:

while (x++ <= 5000000)
{
    y = rnd.Next(1, 5000000);
    if (!data.Contains(y))
        data.Add(y);
    else
    {
        Console.WriteLine("Cycle {2}: Repetation found for number {0} after {1} iteration", y, x, i);
        break;
    }
}

Ho continuato a cambiare il rnd limite massimo (es.5000000) e ho cambiato il numero di iterazioni e ho ottenuto il seguente risultato:

1) if y = rnd.Next(1, 5000) : The average is between 80 to 110 iterations
2) if y = rnd.Next(1, 5000000) : The average is between 2000 to 4000 iterations
3) if y = rnd.Next(1, int.MaxValue) : The average is between 40,000 to 80,000 iterations.

Perché sto ricevendo queste medie, cioèsu 10 volte che ho controllato per ogni valore, l ' 80% del tempo che ho ottenere all'interno di questa gamma media.Io non credo che si può chiamare vicino per essere Casuale.

Cosa posso fare per ottenere un equo numero casuale.

È stato utile?

Soluzione

Non sono test per cicli.Si sta verificando quanto tempo ci vuole per ottenere un numero casuale che hai avuto prima.Che completamente diverso.Le cifre sono a posto per il test quanto tempo ci vuole per ottenere un numero casuale che si aveva prima.Cerca in wikipedia sotto "il compleanno paradosso" per un grafico della probabilità di ottenere una collisione dopo un certo numero di iterazioni.

Per coincidenza, la scorsa settimana ho scritto un articolo di blog su questo argomento.Ma andrà live il 22 Marzo; vedi il mio blog poi per i dettagli.

Se ciò che si vuole testare è la lunghezza del ciclo di un generatore di numeri pseudo casuali allora avete bisogno di guardare per non numero hai avuto prima, ma, piuttosto, una lunga sequenza esatta di numeri che hai avuto prima.Ci sono un certo numero di modi interessanti per farlo, ma probabilmente è più facile per me solo dirvi:la lunghezza del ciclo di Casuale è un paio di miliardi di euro, quindi è improbabile che siano in grado di scrivere un programma che scopre che fatto.Devi memorizzare un sacco di numeri.

Tuttavia, la durata del ciclo non è l'unico parametro per misurare la qualità di un generatore di numeri pseudo casuali.Ricordate, Prng sono non è casuale, sono prevedibile, e, pertanto, si deve riflettere molto attentamente su ciò che la metrica per "casualità" è.

Dacci più dettagli:perché ti preoccupi di come "casuale" Random?Quale programma stai usando per te care?Cosa aspetti della casualità, sono importanti per voi?

Altri suggerimenti

si stanno assumendo che la casualità è meglio se i numeri non si ripetano. Questo non è vero.

reale casualità non ha un ricordo. Quando si prende il numero successivo, la possibilità di ottenere di nuovo lo stesso numero è altrettanto alto come qualsiasi altro numero della serie.

Se si tira un dado e ottiene un sei, quindi scorrere di nuovo i dadi, non v'è meno possibilità di ottenere un sei di nuovo. Se vi capita di avere due sei di fila, questo non significa che i dadi è rotto.

La casualità nella classe Random è ovviamente non è perfetto, ma non è questo che il test rivela. Essa mostra semplicemente una penomenon che si ottiene con ogni ranom generatore di numeri, anche se in realtà crea numeri reali e numeri casuali non solo pseudo-casuali.

giudicate casualità da coppie di ripetizione, che non è il miglior test per casualità. Le ripetizioni che vedete sono simili al paradosso di compleanno: http://en.wikipedia.org/wiki/Birthday_problem , dove un evento di ripetizione può avvenire con una piccola dimensione del campione, se non siete alla ricerca di un evento specifico.

Per la documentazione a http://msdn.microsoft.com /en-us/library/system.random.aspx

  

Per generare un crittograficamente sicuro   numero casuale adatto per la creazione di un   password casuale, ad esempio, utilizzare un   classe derivata da    System.Security.Cryptography .. ::. RandomNumberGenerator   ad esempio    System.Security.Cryptography .. ::. RNGCryptoServiceProvider.

Un computer non può generare un vero e proprio numero casuale. Se avete bisogno di un vero e proprio numero a caso (David ti ha dato l'opzione migliore dal framework dot net) avete bisogno di una fonte casuale esterna.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top