2010-03-15 16 views
13
srand(time(NULL)); 
    for(i = 0; i < n; i++){ 
      for(j = 0; j < (n-1); j++){ 
       a[i][j] = rand(); 
      } 
     } 

Intento generar números aleatorios, pero son los mismos ... ¿Qué debo hacer?Números aleatorios en C

declaración de matriz:

int** a; 
int i; 
printf("Enter array size: "); 
scanf("%d", &n); 

a = (int**)calloc(n, sizeof(int)); 
for(i = 0; i < n; i++) 
    a[i] = (int*)calloc(n-1, sizeof(int)); 
+2

Su primera llamada 'calloc' debería ser' sizeof (int *) 'pero parece estar funcionando en un host en punteros y enteros simples son del mismo tamaño (eso es cierto para la mayoría de las arquitecturas). – mpez0

Respuesta

20

llamada srand() fuera del bucle. Lo estás resembrando en cada iteración.

srand() siembra el generador de números aleatorios para que obtenga una secuencia diferente de números aleatorios según la entrada. Su ciclo se ejecuta muy rápido, por lo que la llamada a time(NULL) siempre devuelve el mismo valor. Estás restableciendo a la misma secuencia aleatoria con cada iteración. Como regla general, solo llame al srand() una vez en su programa.

+0

De acuerdo, usted (generalmente) no debería necesitar generar un generador de números aleatorios más de una vez. – bta

+0

@bta: cierto que no debería necesitar sembrar 'rand()' más de una vez. Volver a sembrar generadores de números aleatorios "adecuados", con lo que me refiero a todo lo que se usa para la seguridad, es otro asunto. –

6

No llame al srand() cada vez que pase por el circuito, simplemente hágalo una vez con anterioridad.

2
srand(time(NULL)); 

for(i = 0; i < n; i++){   
     printf("%d ", time(NULL)); 
     for(j = 0; j < (n-1); j++){ 
      a[i,j] = rand(); 
     } 
    } 

Llamar a srand una vez fuera del circuito.

+0

no ayuda –

3

srand es una función que "siembra" el generador de números aleatorios. En caso de que no lo sepas, los números aleatorios en las computadoras no son realmente aleatorios. En efecto, la computadora solo tiene una lista de números que parecen aleatorios, y usted usa srand para decirle dónde comenzar en esa lista, con cada llamada a rand() devolviendo el siguiente elemento en la lista.

La razón por la que escribe srand(time(NULL)) es obtener los números aleatorios para comenzar en algún punto que no va a ser el mismo cada vez que ejecuta el programa (a menos que los programas comiencen al mismo tiempo).

Entonces, lo que está haciendo aquí es decirle repetidamente al programa que reinicie la lista de números aleatorios en el mismo punto (porque la hora es la misma cada vez que pasa por el ciclo). Mueva la llamada al srand fuera del bucle y obtendrá los resultados correctos.

1

Debe llamar al srand() antes de ingresar al bucle. srand() inicializa el generador de números de radnom con la semilla dada y genera una secuencia única de números aleatorios para esta semilla.

Su bucle se ejecuta muy rápido, por lo que cada llamada a time(NULL) produce el mismo tiempo (medido en segundos) - por lo tanto, inicializa un generador de números aleatorios con la misma semilla en cada iteración de bucle.

4

Preguntas más frecuentes 13.15 a 13.20 serán de su interés. Y estoy tentado de crear una nueva etiqueta para tales preguntas.

+0

Tal vez crear una sola pregunta titulada "¿cómo srand() afecta el estado del generador de números aleatorios?", Y marcar como un duplicado cada vez que aparece otra variación sutil ;-) –

+0

Sí, una versión de CW . Pero entonces estaríamos duplicando todos los comp.lang. *. Faqs, ¿no? – dirkgently

+1

Sí, pero SO inevitablemente contendrá una miríada de duplicados de preguntas frecuentes (por definición de F), por lo que se duplicará comp.lang. *. Faq haga lo que haga. Sin embargo, a menos que las preguntas se marquen de forma despiadada como duplicados, incluso cuando varíen un poco el tema, terminarán con menos información que las preguntas frecuentes existentes (suponiendo que las preguntas frecuentes lo cubran bien). La versión CW de las preguntas frecuentes que también son F on SO podría etiquetarse como tal y vincularse a las preguntas frecuentes sobre el idioma y cualquier otro recurso relevante, y podría formular la pregunta de la manera más general, para asegurar que atrapen a la mayoría de los incautos. O algo. –

0
srand(time(NULL)); 
for(i = 0; i < n; i++){ 
    for(j = 0; j < (n-1); j++){ 
     a[i,j] = rand(); 
    } 
} 

No matter. El número es el mismo ...

+0

¿Qué es esta sintaxis 'a [i, j]'? Desea 'a [i] [j]', probablemente, aunque debería obtener un error de compilación a menos que j sea una matriz simple en lugar de una matriz 2-D, como estoy seguro de que tiene la intención. – indiv

+0

No he recibido el error ... pero los nubmers son los mismos ... –

+0

Muestra la declaración de 'a'. – indiv

0
int** a; 
int i; 
printf("Enter array size: "); 
scanf("%d", &n); 
if(n < 1){ 
    printf("Size should be > 0\n\n"); 
    return NULL; 
} 
a = (int**)calloc(n, sizeof(int)); 
for(i = 0; i < n; i++) 
    a[i] = (int*)calloc(n-1, sizeof(int)); 

Aquí es mi matriz ...

+1

Primero, debe editar su publicación para agregar esta nueva información. Este sitio no funciona como un foro. En segundo lugar, estoy de acuerdo con mi afirmación de que su sintaxis de matriz 2-D es incorrecta, y debe hacer 'a [i] [j]' al acceder a un elemento. Aquí hay un tutorial de matriz multidimensional: http://www.functionx.com/cpp/Lesson12.htm – indiv

+0

No necesita emitir "(int **)" al escribir el código C :). –

+0

hago 'a [i] [j]', pero no ayuda ... –

0

Sergey, no recibió un mensaje de error con la versión a[i,j] simplemente porque se trata de una expresión perfectamente válido. El operador de coma evalúa las subexpresiones de izquierda a derecha y devuelve el valor de la última expresión. Por lo tanto, escribir a[i,j] es idéntico al a[j]. Lo que recibió en la impresión fue el valor del puntero al vector j-ésimo en su matriz.

Cuestiones relacionadas