Domanda
for(i = 0; i < n; i++){
srand(time(NULL));
printf("%d ", time(NULL));
for(j = 0; j < (n-1); j++){
a[i][j] = rand();
}
}
provo a generare numeri casuali, ma sono lo stesso ... provo srand(i * time(NULL))
. Non importa..
Cosa devo fare?
Array dichiarazione:
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));
Soluzione
Chiamata srand()
al di fuori del ciclo. Si sono risemina ogni iterazione.
semi srand()
il generatore di numeri casuali in modo da ottenere una diversa sequenza di numeri casuali a seconda dell'ingresso. Il tuo ciclo corre molto veloce, quindi la chiamata a time(NULL)
sempre restituisce lo stesso valore. Si sta reimpostando alla stessa sequenza casuale ad ogni iterazione. Come regola generale, solo chiamare srand()
una volta nel programma.
Altri suggerimenti
Non chiamare srand()
ogni volta attraverso il ciclo - basta farlo una volta in anticipo
srand
è una funzione che "i semi" il generatore di numeri casuali. Nel caso in cui non si conosce, numeri casuali nei computer non sono realmente casuali. In effetti, il computer solo dispone di una lista di numeri che sembrano casuali in esso, e si utilizza srand
per dirgli dove cominciare in tale elenco, con ogni chiamata a rand()
restituire l'elemento successivo nella lista.
La ragione si scrive srand(time(NULL))
è quello di ottenere i numeri casuali per iniziare ad un certo punto che non sta andando essere lo stesso ogni volta che si esegue il programma (a meno che i programmi iniziano allo stesso tempo).
Quindi quello che state facendo qui è ripetutamente dicendo il programma per riavviare l'elenco di numeri casuali nello stesso punto (perché il tempo è lo stesso ogni volta che si passa attraverso il loop). Spostare la chiamata al srand
di fuori del ciclo e si ottengono i risultati corretti.
srand(time(NULL));
for(i = 0; i < n; i++){
printf("%d ", time(NULL));
for(j = 0; j < (n-1); j++){
a[i,j] = rand();
}
}
chiamate srand una volta fuori dal giro.
È necessario chiamare srand()
prima di entrare nel ciclo. srand()
inizializza il generatore di numeri radnom con il seme dato e genera sequenza unica di numeri casuali per questo seme.
Il ciclo viene eseguito molto veloce in modo che ogni chiamata al time(NULL)
produce lo stesso tempo (in secondi) - da qui si inizializza generatore di numeri casuali con lo stesso seme in ogni iterazione del ciclo
srand(time(NULL));
for(i = 0; i < n; i++){
for(j = 0; j < (n-1); j++){
a[i,j] = rand();
}
}
Non importa. Il numero è lo stesso ...
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));
Ecco il mio allineamento ...
Sergey, è non ha ottenuto un messaggio di errore con la versione a[i,j]
semplicemente perché questo è un'espressione perfettamente valido. L'operatore virgola valuta le sub-espressioni da sinistra a destra e restituisce il valore dell'ultima espressione. Così, la scrittura a[i,j]
è identico a a[j]
. Quello che hai ricevuto nella stampa era il valore del puntatore al vettore j-esimo nella vostra matrice.