2011-10-25 7 views
10

me demandais, si je le code suivant:nombre aléatoire -9 à 9 en C++

int randomNum = rand() % 18 + (-9); 

cela créera un nombre aléatoire -9 à 9?

+0

Connexes: http://stackoverflow.com/questions/686353/c-random-float/686373#686373 –

Répondre

25

Non, ce ne sera pas le cas. Vous recherchez:

int randomNum = rand() % 19 + (-9); 

Il y a 19 entiers distincts entre -9 et +9 (y compris les deux), mais seulement 18 rand() % 18 donne des possibilités. C'est pourquoi vous devez utiliser rand() % 19.

+0

pourquoi 19 mais pas 18 ?? : S confused lol – Danny

+0

@Danny: Voir la réponse étendue. Il est basé sur l'hypothèse que vous voulez à la fois -9 et +9 faire partie de la gamme. Si vous ne le faites pas, veuillez clarifier vos exigences. – NPE

+0

@Danny: puisque 'rand()% 19' est toujours inférieur à 19, la valeur maximale peut être 18 et 18 - 9 est 9. –

7

Votre code renvoie le nombre entre (0-9 et 17-9) = (-9 et 8).

Pour votre information

rand() % N; 

retours nombre entre 0 et N-1 :)

Le bon code est

rand() % 19 + (-9); 
2

Vous avez raison qu'il ya 18 numéros de comptage entre -9 et 9 (inclus).

Mais l'ordinateur utilise des entiers (l'ensemble Z) qui comprend zéro, ce qui en fait 19 nombres.

Le taux minimum que vous obtenez de rand() sur RAND_MAX est 0, donc vous devez soustraire 9 pour obtenir -9.

En outre, manpage for the rand function citations:

« Si vous voulez générer un nombre aléatoire compris entre 1 et 10, vous devez toujours le faire en utilisant des bits d'ordre supérieur, comme dans

j = 1 + (int) (10.0 * (rand()/(RAND_MAX + 1.0))); 

et jamais par quelque chose qui ressemble

j = 1 + (rand() % 10); 

(qui utilise des bits de poids faible). "

Donc, dans votre cas ce serait:

int n= -9+ int((2* 9+ 1)* 1.* rand()/ (RAND_MAX+ 1.)); 
+0

Fait intéressant sur la génération nombres aléatoires avec 'rand()' – Shahbaz

+0

En fait, [d'autres sources] (http://linux.die.net/man/3/rand) citent que ce problème est plus ou moins historique. Mais il y a d'autres problèmes avec la fonction rand() et d'autres opérations mathématiques, comme le fait que 13 nombres auront des chances légèrement plus élevées d'avoir les 6 autres nombres. Si possible, utilisez les nouvelles fonctions de générateur aléatoire de C++ 11 (ou les alternatives de boost) – KillianDS

+0

À noter jusqu'à ce que retiré des pages de manuel. – nurettin

5

Ne pas oublier la nouvelle C++11 pseudo-random functionality, pourrait être une option si votre compilateur supporte déjà.

Pseudo-code:

std::mt19937 gen(someSeed); 
std::uniform_int_distribution<int> dis(-9, 9); 
int myNumber = dis(gen) 
0

Chaque fois que vous avez des doutes, vous pouvez exécuter une boucle qui obtient 100 millions de nombres aléatoires avec votre algorithme original, obtenir les valeurs les plus élevées et les plus bas et voir ce qui se passe.

+0

Ceci est un débogage tellement limité. Et si son code produisait en quelque sorte des pas de 2, max et min pourrait être correct, mais la distribution ne le ferait pas .... En fait, cela n'a de sens que si vous dessinez une sorte d'histogramme. – KillianDS

+0

De quoi parlez-vous? son code est 'rand()% 18 + (-9)' comment produirait-il des pas de 2? et il n'est pas sûr des limites, pas de la distribution. – Petruza

+1

Je parle de l'utilisation de votre test, qui est d'environ 0. La question ne portait pas sur les limites, il s'agissait de "nombres aléatoires entre -9 et 9", donc je suppose qu'il ne sera pas heureux de manquer 0 par exemple. – KillianDS