2009-05-04 10 views
5

Ho usatoQual è la funzione più casuale in C++?

#include<stdlib> 
#include<time> 
using namespace std; 
srand((unsigned)time(0)); 
int n=(rand()>>8)%4; 

ma ciò che altre funzioni casuali sono lì, o quale altra funzione potrebbero essere usati come generatori di numeri casuali?

EDIT: Non ho una ragione particolare per porre questa domanda, volevo solo sapere se C++ avesse altre funzioni casuali.

+4

Si prega di rendere la domanda più chiara; intendi crittograficamente sicuro (difficile da prevedere) o solo una buona distribuzione? – Zifre

risposta

14

Il rand() e srand() sono tutti specifica standard C++. E se si tratta di scrivere il proprio, essere consapevoli di ciò che John von Neumann ha detto:

"Chiunque ritenga aritmetiche metodi di produzione di cifre casuali è , naturalmente, in uno stato di peccato"

-4

Il tempo è in genere l'operazione più casuale che è anche economica da eseguire, ma è ancora possibile prevedere.

Se si desidera la casualità vera, l'utilizzo di una sorta di input esterno è l'unica soluzione.

Quantum Random Bit Generator è un servizio che fornisce tali dati.

+2

Il tempo non è casuale. Una volta scrissi alcuni software di gioco d'azzardo online e non ci fu permesso di usare un generatore casuale basato sul tempo per decidere quali carte trattare. Risulta, è abbastanza facile indovinare approssimativamente a che ora il server è in esecuzione in base alla mano che ti viene distribuita. – rein

+0

Vero. Cancellerò quella linea. –

5

Non strettamente C++, ma Windows specifica:

CryptGenRandom

sono sicuro che tutti i sistemi operativi hanno i loro equivalenti funzioni generatore di numeri casuali crittograficamente sicuro.

-2

Casuale fornisce un buon numero casuale alla distribuzione uniforme e fa un buon lavoro.

Qualsiasi altra cosa significherebbe che si desidera effettivamente distorcere la distribuzione.

Ad esempio, l'utilizzo del generatore GUID di Microsoft fornisce un ID casuale che è meno probabile che venga ripetuto e tiene conto di cose come il tempo e il computer.

+1

GUID non sono casuali –

+0

Penso che stia cercando funzioni crittograficamente sicure, non solo distribuzione uniforme. Le domande non sono molto chiare però. – Zifre

+0

@Uri Amd che cos'è questo "Casuale" a cui fai riferimento in "Casuale ti dà ..."? –

16
  • Boost Random Number Library offre una vasta gamma di generatori (qualità vs prestazioni) e alcune tipiche distribuzioni casuali. Tutto piuttosto bello e semplice da usare.
  • Se desideri altri metodi/librerie, quindi google per i numeri casuali crittografici, puoi anche utilizzare this document come riferimento.
  • Non inventare le proprie soluzioni a meno che non si sia un esperto/ricercatore nel campo/ecc., Sfruttare le soluzioni già esistenti che sono state solitamente scritte da Smart People e accuratamente esaminate da altre persone intelligenti. funzioni
2
int unixrand() 
{ 
    int x; 
    int f = open("/dev/random", O_RDONLY); 
    if (f < 0) return -1; /* Error */ 
    if (sizeof(x) != read(f, &x, sizeof(x))) { 
     close(f); 
     return -1; 
    } 
    close(f);  
    if (x < 0) x = ~x; 
    return x; 
} 
+0

Perché il controllo per x <0? Inoltre,/dev/urandom sarebbe una scelta migliore, a meno che non si vogliano dati realmente casuali (per la crittografia, ecc.)./dev/random è una risorsa troppo preziosa :) – Paggas

+1

Sto facendo una funzione che restituisce qualsiasi casuale casuale x come la funzione di libreria standard C. Sì,/dev/urandom è migliore per la maggior parte dei casi. – Joshua

1

(Cross-posting da un answer I just wrote a una domanda simile)

Dai un'occhiata a ISAAC (Indir., Shift, Accumula, Aggiungi e Conta). E 'uniformemente distribuito e ha una durata media del ciclo di 2^8295.

È anche veloce, dal momento che non comporta la moltiplicazione o il modulo.

0

Bruce Schneier e John Kelsey hanno scritto a random number generator potresti essere interessato. Piuttosto, è un generatore di semi. Anche se Yarrow non è più supportato, potresti essere interessato a come raccoglie l'entropia.

OpenSSL has an API che è relativamente facile da accedere e piuttosto portatile. E Mozilla viene fornito con a decent API that wraps whatever the OS offers.

Personalmente, però, generalmente utilizzo Boost.Random, che era già stato suggerito.

14

Questo codice è piuttosto efficiente. Sebbene gli utenti possano iniziare a notare un pattern dopo alcune iterazioni.

int FastRandom() 
{ 
    return 10; 
} 
+3

LOL !! bravo! – fengshaun

+1

Hai appena copiato il numero 221 :) http://xkcd.com/221/ –

+0

Non era consapevole, ma sì, bravo cartone animato e probabilmente l'ho visto! – justinhj

Problemi correlati