Pergunta
for(i = 0; i < n; i++){
srand(time(NULL));
printf("%d ", time(NULL));
for(j = 0; j < (n-1); j++){
a[i][j] = rand();
}
}
Eu tento gerar números aleatórios, mas eles são iguais ... eu tento srand(i * time(NULL))
. Não importa .. o que devo fazer?
Declaração de Array:
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));
Solução
Ligar srand()
fora do loop. Você está reavalindo todas as iterações.
srand()
Sementes O gerador de números aleatórios para obter uma sequência diferente de números aleatórios, dependendo da entrada. Seu loop funciona muito rápido, então a chamada para time(NULL)
sempre retorna o mesmo valor. Você está redefinindo para a mesma sequência aleatória a cada iteração. Como regra geral, apenas ligue srand()
uma vez no seu programa.
Outras dicas
Não ligue srand()
Toda vez que através do loop - faça isso uma vez antes.
srand
é uma função que "sementes" o gerador de números aleatórios. Caso você não saiba, números aleatórios em computadores não são realmente aleatórios. Com efeito, o computador tem apenas uma lista de números que parecem aleatórios e você usa srand
para dizer por onde começar nessa lista, com cada chamada para rand()
retornando o próximo item na lista.
A razão pela qual você escreve srand(time(NULL))
é obter os números aleatórios para começar em algum momento que não serão os mesmos toda vez que você executa o programa (a menos que os programas iniciem ao mesmo tempo).
Então, o que você está fazendo aqui está dizendo repetidamente ao programa para reiniciar a lista de números aleatórios no mesmo ponto (porque o tempo é o mesmo cada vez que você passa pelo loop). Mover a chamada para srand
Fora do loop e você obterá os resultados corretos.
srand(time(NULL));
for(i = 0; i < n; i++){
printf("%d ", time(NULL));
for(j = 0; j < (n-1); j++){
a[i,j] = rand();
}
}
Ligue para Srand uma vez fora do loop.
Você precisa ligar srand()
Antes de entrar no loop. srand()
Inicializa o gerador de números Radnom com a semente dada e gera sequência exclusiva de números aleatórios para esta semente.
Seu loop é executado muito rápido, então toda chamada para time(NULL)
Gosta ao mesmo tempo (medido em segundos) - portanto, você inicializa o gerador de números aleatórios com a mesma semente em cada iteração do loop.
srand(time(NULL));
for(i = 0; i < n; i++){
for(j = 0; j < (n-1); j++){
a[i,j] = rand();
}
}
Não importa. O número é o mesmo ...
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));
Aqui está minha matriz ...
Sergey, você não recebeu uma mensagem de erro com o a[i,j]
Versão simplesmente porque esta é uma expressão perfeitamente válida. O operador de vírgula avalia as subexpressões da esquerda para a direita e retorna o valor da última expressão. Assim, escrevendo a[i,j]
é idêntico a a[j]
. O que você recebeu na impressão foi o valor do ponteiro para o j-éscel em sua matriz.