Pregunta

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

intento generar números aleatorios, pero son lo mismo ... Trato srand(i * time(NULL)). No importa.. ¿Qué debo hacer?

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));
¿Fue útil?

Solución

srand() llamadas fuera del bucle. Usted está resiembra cada iteración.

semillas srand() el generador de números aleatorios para que pueda obtener una secuencia diferente de números aleatorios en función de la entrada. El bucle se ejecuta muy rápido, por lo que la llamada a time(NULL) siempre devuelve el mismo valor. Usted está reposicionando a la misma secuencia aleatoria con cada iteración. Como regla general, sólo se llame srand() una vez en su programa.

Otros consejos

No llame srand() cada vez que a través del lazo - sólo lo hacen una vez antemano

.

FAQs 13,15 a 13.20 será de interés. Y me siento tentado a crear una nueva etiqueta para este tipo de preguntas.

srand es una función que "semillas", el generador de números aleatorios. En caso de que no saben, números aleatorios en computadoras no son realmente al azar. En efecto, la computadora solo tiene una lista de números que parecen al azar en ella, y se utiliza srand que le indiquen dónde comenzar en esa lista, con cada llamada a rand() devolver el siguiente elemento de la lista.

La razón de escribir srand(time(NULL)) es conseguir que los números aleatorios para comenzar en algún momento que no va a ser el mismo cada vez que se ejecuta el programa (a menos que los programas se inician al mismo tiempo).

Así que lo que está haciendo aquí está diciendo repetidamente el programa para reiniciar la lista de números aleatorios en el mismo punto (ya que el tiempo es el mismo cada vez que vaya a través del bucle). Mover la llamada a srand fuera del bucle y obtendrá los resultados correctos.

text alt

srand(time(NULL)); 

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

Llamada srand una vez fuera del bucle.

Es necesario llamar srand() antes de entrar en el bucle. srand() inicializa el generador de números radnom con la semilla dada y genera secuencia única de números aleatorios para esta semilla.

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

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

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

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í está mi matriz ...

Sergey, que 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 coma evalúa las sub-expresiones de izquierda a derecha y devuelve el valor de la última expresión. De este modo, la escritura a[i,j] es idéntica a a[j]. Lo que recibió en la impresión fue el valor del puntero al vector j-ésimo en su matriz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top