Question

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

J'essaie de générer des nombres aléatoires, mais ils sont les mêmes ... J'essaie srand(i * time(NULL)). Peu importe.. Que dois-je faire?

Déclaration de tableau:

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));
Était-ce utile?

La solution

Appel srand() en dehors de la boucle. Vous réensemencement chaque itération.

srand() graines le générateur de nombres aléatoires de sorte que vous obtenez une autre séquence de nombres aléatoires en fonction de l'entrée. Votre boucle court très vite, de sorte que l'appel à time(NULL) retourne toujours la même valeur. Vous remise à la même séquence aléatoire à chaque itération. En règle générale, appelez seulement srand() une fois dans votre programme.

Autres conseils

Ne pas appeler srand() chaque fois dans la boucle - il suffit de le faire une fois à l'avance

.

13,15 13,20 sera intéressant. Et je suis tenté de créer une nouvelle balise pour ces questions.

srand est une fonction qui « graines » le générateur de nombres aléatoires. Si vous ne savez pas, nombres aléatoires dans les ordinateurs ne sont pas vraiment au hasard. En effet, l'ordinateur a juste une liste de numéros qui semblent aléatoires en elle, et que vous utilisez srand pour lui dire où commencer dans cette liste, chaque appel à rand() retourner l'élément suivant dans la liste.

La raison pour laquelle vous écrivez srand(time(NULL)) est d'obtenir les nombres aléatoires pour commencer à un moment donné qui ne va pas être le même à chaque fois que vous exécutez le programme (à moins que les programmes commencent en même temps).

Alors ce que vous faites ici est de dire à plusieurs reprises le programme de redémarrer la liste de nombres aléatoires au même point (parce que le temps est le même à chaque fois que vous passez par la boucle). Déplacer l'appel à srand dehors de la boucle et vous obtiendrez des résultats corrects.

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

Appel Srand une fois en dehors de la boucle.

Vous devez appeler srand() avant d'entrer dans la boucle. srand() initialise le générateur de nombres radnom avec la semence donnée et génère la séquence de nombres aléatoires uniques pour cette graine.

Votre boucle exécute très rapide pour chaque appel à time(NULL) donne en même temps (en secondes) - donc vous initialisez générateur de nombres aléatoires avec la même graine à chaque itération de la boucle

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

Peu importe. Le nombre sont les mêmes ...

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

Voici mon tableau ...

Sergey, vous n'avez pas un message d'erreur avec la version a[i,j] simplement parce que c'est une expression parfaitement valable. L'opérateur virgule évalue les sous-expressions de gauche à droite et retourne la valeur de la dernière expression. Ainsi, l'écriture a[i,j] est identique à a[j]. Qu'est-ce que vous avez reçu dans l'impression était la valeur du pointeur au vecteur j-ième dans votre matrice.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top