2011-10-25 17 views
10

pregunto, si tengo el siguiente código:número al azar de -9 a 9 en C++

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

se esta crear un número al azar de -9 a 9?

+0

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

Respuesta

25

No, no lo hará. Usted está buscando:

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

Hay 19 números enteros distintos entre -9 y 9 (ambos inclusive), pero rand() % 18 sólo da 18 posibilidades. Es por eso que necesita usar rand() % 19.

+0

¿por qué 19 pero no 18? : S confusión lol – Danny

+0

@Danny: ver la respuesta expandida. Se basa en la suposición de que desea que ambos -9 y +9 sean parte del rango. Si no lo hace, aclare sus requisitos. – NPE

+0

@Danny: como 'rand()% 19' siempre es menor que 19, el valor máximo puede ser 18 y 18 - 9 es 9. –

7

Su código devuelve el número entre (0-9 y 17-9) = (-9 y 8).

Para su información

rand() % N; 

rendimientos número entre 0 y N-1 :)

el código es

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

Tiene usted razón en que hay 18 números de recuentos entre -9 y 9 (inclusive).

Pero la computadora usa números enteros (el conjunto Z) que incluye cero, lo que lo convierte en 19 números.

La proporción mínima que obtienes de rand() sobre RAND_MAX es 0, por lo que debes restar 9 para llegar a -9.

Además, manpage for the rand function cotizaciones:

"Si se quiere generar un entero aleatorio entre 1 y 10, siempre debe hacerlo mediante el uso de bits de orden superior, como en

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

y nunca por nada que se parezca

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

(que utiliza bits de orden inferior). "

Así que en su caso sería:

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

Dato interesante sobre la generación Números aleatorios con 'rand()' – Shahbaz

+0

En realidad, [algunas otras fuentes] (http://linux.die.net/man/3/rand) indican que este problema es más o menos histórico. Pero hay otros problemas con el funk rand() y otras operaciones matemáticas en él, tales como que 13 numbres tendrán una posibilidad ligeramente mayor de que ocurran los otros 6 números. Si es posible, use las nuevas funciones de generador aleatorio de C++ 11 (o las alternativas de impulso) – KillianDS

+0

. Digno de mención hasta que se eliminen de las páginas de manual. – nurettin

5

No se olvide de la nueva C++11 pseudo-random functionality, podría ser una opción si su compilador ya lo soporta.

Pseudo-código:

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

Cada vez que tienes dudas, puede ejecutar un bucle que recibe 100 millones de números aleatorios con el algoritmo original, obtener los valores mínimo y máximo y ver qué pasa.

+0

Esta es una depuración tan limitada. ¿Qué pasa si su código de alguna manera produce los pasos de 2, máximo y mínimo podría ser correcto, pero la distribución no ...? En realidad, esto solo tiene sentido si dibujas algún tipo de histograma – KillianDS

+0

¿De qué estás hablando? su código es 'rand()% 18 + (-9)' ¿cómo produciría los pasos de 2? y él no está seguro acerca de los límites, no de la distribución. – Petruza

+1

Estoy hablando del uso de su prueba, que es aproximadamente 0. La pregunta no era sobre los límites, se trataba de "números aleatorios entre -9 y 9", así que supongo que no estará contento con la falta 0 por ejemplo. – KillianDS