rand () no genera números aleatorios después de la operación de módulo

Estoy tomando un refresco de C y tomé un juego de mesa como ejercicio. El juego de mesa es “Juego de los generales” y es muy parecido al ajedrez, ya que utiliza piezas con rangos en un cuadrado de 8×8.

Básicamente, la implementación de una placa es una matriz bidimensional de una estructura particular. Por lo tanto, se puede acceder a un cuadrado del tablero a través de sus índices, de manera muy similar a un sistema de coordenadas xy.

Ahora decidí distribuir aleatoriamente las piezas en el tablero, y la lógica es generar una coordenada xy aleatoria, verificar si una pieza ya reside en esas coordenadas en la pizarra y rellenarla con una pieza si está disponible. Si no lo es, entonces se genera otra coordenada xy aleatoria. Esto continúa hasta que se tienen en cuenta todas las piezas.

Estoy usando rand () para generar números aleatorios dentro de un rango específico (estoy usando un operador de módulo y un número de relleno para dictar el rango. Vea el código a continuación)

Pero rand () no parece dar números suficientemente aleatorios para que yo pueda trabajar. ¡Sigo terminando con la misma distribución de piezas una y otra vez! (Pero lo suficientemente interesante, puedo generar una distribución diferente en una Mac, ¡pero la distribución sigue siendo consistente!)

Vea el código a continuación sobre cómo estoy usando rand () para generar un número con un rango.

void initPieces(){ int player, rank_index, population, rand_min, rand_x, rand_y; for(player = 1; player <= 2; player++){ if(player == 1){ rand_min = 5; }else{ rand_min = 1; } for(rank_index = 0; ir < sizeof ranking/sizeof ranking[0]; rank_index++){ for(population = 0; population population; population++){ do{ rand_x = (rand() % 8) + 1; rand_y = (rand() % 4) + rand_min; }while((getGrid(rand_x,rand_y))->has_piece == 1); assignPiecetoGrid(player,rank_index,rand_x,rand_y); } } } } 

Debes darte cuenta de que rand() es un generador de números pseudoaleatorios , y está diseñado específicamente para devolver la misma secuencia de números para una semilla dada. La semilla se establece con la función srand() .

 srand(0); printf("the first rand() with seed 0 is %d\n", rand()); srand(1); printf("the first rand() with seed 1 is %d\n", rand()); srand(0); printf("the first rand() with seed 0 is still %d\n", rand()); 

Por lo tanto, la forma de hacerlo menos predecible es generalmente volver a sembrar de algo un poco más aleatorio, o al menos de algo que no es el mismo cada vez que ejecutas el progtwig:

srand( time (NULL));

Asegúrese de inicializar / sembrar el generador de números aleatorios:

 #include  srand(time(NULL)); 

Si no siembra el generador de números pseudoaleatorios, es como si hubiera llamado al inicio de su progtwig:

 srand(1); 

Puede llamar a srand con un argumento que depende del tiempo para que dos llamadas sucesivas de su progtwig generen números diferentes:

 srand(time(NULL)); 

Sí, porque no has “inicializado” el rand (). Trate de hacer algo como ese srand (time(NULL)) ;

Tienes que incluir time.h

Debes usar srand () para sembrar tu generador aleatorio.

Una siembra aleatoria común es srand ( time(NULL) );

Llama a esto una vez:

 srand (time(NULL)); 

para inicializar antes de llamar a rand()

El generador de números aleatorios debe inicializarse con semilla aleatoria. Ver la función srand() . A menudo se inicializa con el tiempo: srand(time(NULL)) .

Todas las respuestas son correctas, necesitas sembrar la función rand con algo como

 srand(time(NULL)); 

¿Pero por qué?

‘Brand’ es un llamado generador de números pseudoaleatorios. Eso significa que los números no son realmente aleatorios, pero la función utiliza un algoritmo que produce una secuencia de números que tienen características similares a los números aleatorios, especialmente con respecto a la distribución uniforme.

Esto significa que cuando se usa la misma semilla, se producirá la misma secuencia. Es por esto que a esos generadores también se les llama generadores de números aleatorios deterministas.

Sembrarlo proporcionará un valor de inicio diferente y, por lo tanto, dará como resultado diferentes secuencias numéricas.