Come si genera un numero casuale compreso tra 0 e 1?c - generatore di numeri casuali
risposta
È possibile generare un numero pseudocasuale utilizzando stdlib.h. Semplicemente includere stdlib, quindi chiamare
double random_number = rand()/(double)RAND_MAX;
Per riferimento, questo darà valori in [0.0, 1.0], compresi entrambi 0.0 e 1.0. –
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
@MSalters, questo è un problema interessante, qualche idea su una soluzione? –
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
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).
Davvero casuale o pseudocasuale? – tvanfosson
qual è la differenza? – tm1
@ 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