2010-03-07 6 views
15

Comment générer un nombre aléatoire compris entre 0 et 1?c - générateur de nombres aléatoires

+5

Vraiment aléatoire ou pseudo-aléatoire? – tvanfosson

+2

Quelle est la différence? – tm1

+0

@ tm1 - Les nombres pseudo-aléatoires ne font qu'approcher les propriétés des nombres aléatoires et ne conviendront pas nécessairement aux applications qui requièrent un réel caractère aléatoire, comme la cryptographie. Voir http://en.wikipedia.org/wiki/Pseudorandom_number_generator pour une explication. – tvanfosson

Répondre

22

Vous pouvez générer un nombre pseudo-aléatoire à l'aide de stdlib.h. Il suffit d'inclure stdlib, puis appelez

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

Pour référence, cela donnera des valeurs dans [0.0, 1.0] c'est-à-dire incluant à la fois 0.0 et 1.0. –

+3

Et surtout, il ne sera probablement pas équitable (!) Il existe de nombreuses implémentations où l'ensemble [0.0, 1.0] contient plus de RAND_MAX éléments. (En C, l'ensemble [0.0, 1.0] est un ensemble fini dénombrable_) – MSalters

+0

@ MSalters, c'est un problème intéressant, des idées sur une solution? –

9

En supposant OP veut soit 0, soit 1:

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

Modifier inspiré par commentaire: Old rand() implémentations ont un défaut - bits d'ordre inférieur avaient des périodes beaucoup plus courtes que bits d'ordre supérieur, donc l'utilisation de bits de poids faible pour de telles implémentations n'est pas bonne. Si vous connaissez votre implémentation rand() souffre de cette faille, utiliser peu d'ordre supérieur, comme celui-ci:

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

en supposant des architectures régulières par octet 8 bits

+0

Cela fonctionne parfaitement, merci. – tm1

+1

vous devriez changer le résultat de 'rand()' pour tenir compte des problèmes avec les générateurs congruents linéaires – Christoph

+0

@Christoph Merci, j'ai édité mon post pour refléter votre point de vue. – qrdl

8

man 3 drand48 est-exactement ce que vous avez demandé pour.

Le drand48() et erand48() fonctions retournent non-négatif, en double précision, les valeurs à virgule flottante, répartie uniformément sur l'intervalle [0,0, 1,0].

Ils se trouvent dans #include <stdlib.h> sur les plateformes UNIX. Ils ne sont pas en C ANSI, donc, (par exemple) vous ne les trouverez pas sur Windows à moins que vous n'apportiez votre propre implémentation (par exemple, LibGW32C).

Questions connexes