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

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.

Perguntas frequentes 13.15 para 13.20 será de interesse. E sou tentado a criar uma nova tag para essas perguntas.

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.

alt text

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top