2011-02-07 27 views
17

Es posible generar un número aleatorio diferente, cada vez que se ejecuta un ciclo. Por ejemplo, tengo:¿Cómo generar diferentes números aleatorios en un bucle en C++?

for (int t=0;t<10;t++) 
{ 
    int random_x; 
    srand (time(NULL)); 
    random_x = rand() % 100; 
    cout<<"\nRandom X = "<<random_x; 
} 

Pero el problema es que genera el mismo número aleatorio cada vez. ¿Es posible generar diferentes números aleatorios cada vez que se ejecuta un ciclo?

¿Existe alguna posibilidad de restablecer la inicialización de números aleatorios también?

+3

Leer la documentación para 'srand()' podría ser útil. –

+1

Solo para hacer un poco más útil el comentario de Noah: http://www.cplusplus.com/reference/clibrary/cstdlib/srand/ :) –

+1

posible duplicado de [Números siempre repetidos dados por rand()] (http: // stackoverflow.com/questions/4859089/always-repeated-numbers-given-by-rand) –

Respuesta

22

No utilice srand dentro del circuito, úsela solo una vez, p. Ej. al comienzo de main(). Y srand() es exactamente cómo restablecer esto.

+0

Lo hice, pero cambia el valor aleatorio solo una vez ahora. Como por ejemplo, genera 15, 23, 23, 23, 23. Ahora, ¿qué debo hacer? – bijlikamasla

+6

Si realmente lo pones al principio de main(), no obtendrías esa secuencia . – etarion

+1

Aún si ejecuta el programa más de una vez con en el segundo, la secuencia de números aleatorios será la misma –

16

Obtiene el mismo número aleatorio cada vez, porque está estableciendo una semilla dentro del ciclo. Aunque esté usando time(), solo cambia una vez por segundo, por lo que si el ciclo finaliza en un segundo (lo que probablemente ocurra), obtendrá el mismo valor inicial cada vez y el mismo número aleatorio inicial.

Mueva la llamada srand() fuera del ciclo (y llámelo solo una vez, al inicio de su aplicación) y obtendrá números aleatorios "aleatorios".

+3

Moverlo fuera del bucle podría no ser suficiente, ya que el bucle podría llamarse más de una vez por segundo. –

+2

Oh, buen punto - aclarado. – payne

+0

Lo hice, pero cambia el valor aleatorio solo una vez. Como por ejemplo, genera 15, 23, 23, 23, 23. Ahora, ¿qué debo hacer? – bijlikamasla

0

Deje de sembrar el generador todo el tiempo. Extraiga la llamada srand del ciclo

+0

Lo hice , pero cambia el valor aleatorio solo una vez ahora. Como por ejemplo, genera 15, 23, 23, 23, 23. Ahora, ¿qué debo hacer? – bijlikamasla

+1

¿Realmente necesita escribir el mismo comentario en cada respuesta? –

3

Trate de mover la semilla srand fuera del bucle de esta manera:

srand (time(NULL)); 
for (int t=0;t<10;t++) 
{ 
    int random_x; 
    random_x = rand() % 100; 
    cout<< "\nRandom X = "<<random_x; 
} 

Como dice Mark Ransom en el comentario, moviendo la semilla fuera del bucle sólo ayudará si el bucle no está residiendo en una función que está llamando varias veces

+0

Moverlo fuera del bucle podría no ser suficiente, ya que el bucle podría llamarse más de una vez por segundo. –

+0

Lo hice, pero cambia el valor aleatorio solo una vez. Como por ejemplo, genera 15, 23, 23, 23, 23. Ahora, ¿qué debo hacer? – bijlikamasla

0

Mueva la llamada srand al inicio del programa. Como lo tiene ahora, el tiempo puede ser el mismo entre dos llamadas consecutivas, por lo que el generador de números aleatorios comenzará de nuevo en el mismo lugar.

+0

Lo hice, pero cambia el valor aleatorio solo una vez. Como por ejemplo, genera 15, 23, 23, 23, 23. Ahora, ¿qué debo hacer? – bijlikamasla

0

Necesita extraer la iniciación de time() fuera del ciclo for.

Aquí hay un ejemplo que arrojará en la consola de Windows el número aleatorio esperado (ahah).

#include <iostream> 
#include <windows.h> 
#include "time.h" 
int main(int argc, char*argv[]) 
{ 
    srand (time(NULL)); 
    for (int t = 0; t < 10; t++) 
    { 
     int random_x; 

     random_x = rand() % 100; 
     std::cout << "\nRandom X = " << random_x << std::endl; 
    } 
    Sleep(50000); 
    return 0; 
} 
+0

dice No se encontró Identificador de Sueño – bijlikamasla

+0

¿Incluyó Windows.h? Esta pieza de código funciona bien para mí en VS2008. –

+0

Lo usé, pero dice "La aplicación ha solicitado el tiempo de ejecución para terminarlo de manera inusual – bijlikamasla

0

La función de tiempo probablemente devuelve el mismo valor durante cada iteración del ciclo.

Intente inicializar la semilla aleatoria antes del ciclo.

+0

Lo hice, pero cambia el valor aleatorio solo una vez ahora. Como por ejemplo, genera 15, 23, 23, 23, 23. Ahora, ¿qué debo hacer? – bijlikamasla

0

Cada iteración está restableciendo la secuencia de números pseudoaleatorios porque está llamando al srand con la misma semilla (ya que la llamada a time es tan frecuente). Utilice una semilla diferente o llame al sranduna vez antes de ingresar al ciclo.

+0

Lo hice, pero cambia el valor aleatorio solo una vez. Como por ejemplo, genera 15, 23, 23, 23, 23. Ahora, ¿qué debo hacer? – bijlikamasla

+1

Sí, podemos leerlo. Has publicado eso en 5 lugares diferentes. – Marlon

-1

No conozco hombres. Encontré la mejor manera para mí después de probar diferentes formas, como 10 minutos. (Cambie los números de código para obtener números aleatorios grande o pequeño.)

int x; 
srand (time(NULL)); 
x = rand() % 1000 * rand() % 10000 ; 
cout<<x; 
1

tenía este mismo problema durante días. Mantener srand() fuera del ciclo es un +. Además, no asigne rand()% 100 a ninguna variable.Simplemente cout rand()% 100 en el ciclo. Prueba esto:

srand (time(NULL)); 
    (int t=0;t<10;t++) 
    { 
    cout << rand() % 100 << endl; 
    } 
0

Si tiene randoms desde el principio en el programa que podría multiplicar la variable de bucle en el momento - para dar una mejor distribución. Por ejemplo

for (int t = 0; t < 10; t++){ 
     srand(time(NULL)*t); 
     random = rand() % GetScreenWidth(); 

} 
7

hacer no uso rand(); utilice las nuevas instalaciones de C++ 11 (por ejemplo, std::mt19937, std::uniform_int_distribution, etc.).

Puede utilizar código como este (live here on Ideone):

#include <iostream> 
#include <random> 
using namespace std; 

int main() 
{ 
    // Random seed 
    random_device rd; 

    // Initialize Mersenne Twister pseudo-random number generator 
    mt19937 gen(rd()); 

    // Generate pseudo-random numbers 
    // uniformly distributed in range (1, 100) 
    uniform_int_distribution<> dis(1, 100); 

    // Generate ten pseudo-random numbers 
    for (int i = 0; i < 10; i++) 
    { 
     int randomX = dis(gen); 
     cout << "\nRandom X = " << randomX; 
    } 
} 

P. S.

Considérese de ver este video conferencia desde Going Native 2013 para más detalles acerca de los problemas relacionados con la PI: rand()

rand() Considered Harmful

0
/*this code is written in Turbo C++ 
For Visual Studio, code is in comment*/ 

int a[10],ct=0,x=10,y=10; //x,y can be any value, but within the range of 
          //array declared 
randomize();     //there is no need to use this Visual Studio 
for(int i=0;i<10;i++) 
{ a[i]=random(10);   //use a[i]=rand()%10 for Visual Studio 
} 
cout<<"\n\n"; 
do 
{ ct=0; 
    for(i=0;i<x;i++) 
    { for(int j=0;j<y;j++) 
     { if(a[i]==a[j]&&i!=j) 
      { a[j]=random(10); //use a[i]=rand()%10 for Visual Studio 
      } 
      else 
      { ct++; 
      } 
     } 
    } 
}while(!(ct==(x*y))); 

Bueno, yo no soy un profesional en C++, pero lo aprendí en la escuela Estoy usando este algo durante el último año para almacenar diferentes valores aleatorios en una matriz 1D, pero esto también funcionará en la matriz 2D después de algunos cambios. Cualquier sugerencia sobre el código es bienvenida.

Cuestiones relacionadas