2010-03-07 22 views
15

Come si genera un numero casuale compreso tra 0 e 1?c - generatore di numeri casuali

+5

Davvero casuale o pseudocasuale? – tvanfosson

+2

qual è la differenza? – tm1

+0

@ tm1 - I numeri pseudocasuali si avvicinano solo alle proprietà dei numeri casuali e non sono necessariamente adatti per applicazioni che richiedono una casualità reale, come la crittografia. Vedi http://en.wikipedia.org/wiki/Pseudorandom_number_generator per una spiegazione. – tvanfosson

risposta

22

È possibile generare un numero pseudocasuale utilizzando stdlib.h. Semplicemente includere stdlib, quindi chiamare

double random_number = rand()/(double)RAND_MAX; 
+2

Per riferimento, questo darà valori in [0.0, 1.0], compresi entrambi 0.0 e 1.0. –

+3

E, cosa più importante, molto probabilmente non sarà corretto (!) Ci sono molte implementazioni in cui il set [0.0, 1.0] contiene più di elementi RAND_MAX. (_In C, l'insieme [0.0, 1.0] è un insieme finito numerabile_) – MSalters

+0

@MSalters, questo è un problema interessante, qualche idea su una soluzione? –

9

Supponendo OP vuole 0 o 1:

srand(time(NULL)); 
foo = rand() & 1; 

Edit ispirato commento: Vecchi rand() implementazioni avevano un difetto - i bit di ordine inferiore avuto periodi molto più brevi rispetto bit di ordine superiore, quindi l'uso di bit di basso ordine per tali implementazioni non è buono. Se si conosce l'implementazione rand() soffre di questo difetto, utilizzare po 'di ordine superiore, in questo modo:

foo = rand() >> (sizeof(int)*8-1) 

assumendo regolari architetture 8-bit-per-byte

+0

Funziona perfettamente, grazie. – tm1

+1

dovresti spostare il risultato di 'rand()' per tenere conto dei problemi con i generatori lineari congruenziali – Christoph

+0

@Christoph Grazie, ho modificato il mio post per riflettere il tuo punto. – qrdl

8

man 3 drand48 è esattamente quello che hai chiesto per.

Il drand48() e erand48() restituiscono non negativo, doppia precisione, i valori in virgola mobile, distribuito uniformemente sull'intervallo [0,0, 1,0].

Questi si trovano in #include <stdlib.h> su piattaforme UNIX. Tuttavia, non sono in ANSI C, quindi (ad esempio) non li troverai su Windows a meno che non porti la tua implementazione (ad esempio LibGW32C).

Problemi correlati