web-dev-qa-db-fra.com

Comment générer un nombre aléatoire compris entre et 1?

Je veux générer des nombres aléatoires entre (0,1). J'essaie ce qui suit:

double r2()
{
    return((Rand() % 10000) / 10000.0);
}

int SA()
{
    double u;
    u = r2();
}

Mais cela ne génère pas le résultat attendu. Comment puis-je le réparer?

19
user739062

Dans votre version, Rand() % 10000 donnera un entier compris entre 0 et 9999. Étant donné que Rand_MAX ne doit pas dépasser 32767, et comme ceci n’est pas exactement divisible par 10 000 et pas grand par rapport à 10 000, il y aura un biais significatif dans le caractère aléatoire du résultat. De plus, la valeur maximale sera 0,9999, et non 1,0. et vous avez inutilement limité vos valeurs à quatre décimales.

C’est une simple arithmétique, un nombre aléatoire divisé par le nombre maximum possible donnera un nombre compris entre 0 et 1 inclus, tout en utilisant la résolution et la distribution complètes du RNG.

double r2()
{
    return (double)Rand() / (double)Rand_MAX ;
}

Utilisez (double)Rand() / (double)((unsigned)Rand_MAX + 1) si l'exclusion de 1.0 était intentionnelle.

26
Clifford

Voici une procédure générale pour produire un nombre aléatoire dans une plage spécifiée:

int randInRange(int min, int max)
{
  return min + (int) (Rand() / (double) (Rand_MAX + 1) * (max - min + 1));
}

Selon l'algorithme PRNG utilisé, l'opérateur % peut générer une séquence de nombres très non - aléatoire. 

6
John Bode

Il me semble que vous n’avez pas appelé srand en premier . Exemple d’utilisation ici .

1
kay

Définissez la graine en utilisant srand (). En outre, vous ne spécifiez pas la valeur maximale dans Rand (), elle utilise donc Rand_MAX. Je ne sais pas si c'est en réalité 10000 ... pourquoi ne pas simplement le spécifier. Bien que nous ne sachions pas quels sont vos "résultats attendus". C'est un générateur de nombres aléatoires. Qu'attendez-vous et que voyez-vous?

Comme indiqué dans un autre commentaire, SA () ne renvoie rien explicitement.

http://pubs.opengroup.org/onlinepubs/009695399/functions/Rand.htmlhttp://www.thinkage.ca/english/gcos/expl/c/lib/Rand. html

Edit: From Générer un nombre aléatoire compris entre [-1, 1] en C?((float)Rand())/Rand_MAX renvoie un nombre en virgule flottante dans [0,1]

0
Stealth Rabbi