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?
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.
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.
Il me semble que vous n’avez pas appelé srand en premier . Exemple d’utilisation ici .
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]