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));
È stato utile?

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

.

13.15 per 13.20 sarà di interesse. E io sono tentato di creare un nuovo tag per tali questioni.

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.

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(); 
        } 
    } 

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top