Générer nombre aléatoirement
Résolu/Fermé
stark173
Messages postés
105
Date d'inscription
vendredi 26 juillet 2013
Statut
Membre
Dernière intervention
6 février 2015
-
10 déc. 2013 à 15:15
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 11 déc. 2013 à 17:05
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 11 déc. 2013 à 17:05
A voir également:
- Générer nombre aléatoirement
- Comment générer un qr code - Guide
- Generer mot de passe - Télécharger - Sécurité
- Nombre facile - Télécharger - Outils professionnels
- Nombre de combinaison possible avec 10 chiffres - Forum Programmation
- En raison d'un nombre important d'échec de connexion snapchat - Forum Snapchat
1 réponse
[Dal]
Messages postés
6174
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 février 2024
1 083
Modifié par [Dal] le 10/12/2013 à 15:47
Modifié par [Dal] le 10/12/2013 à 15:47
Salut stark173,
Le 2ème tableau, comme indiqué par le commentaire, permet de savoir (rapidement) si le numéro a déjà été tiré.
Lors de la déclaration
Lorsqu'un numéro est tiré, le numéro tiré est utilisé comme index du tableau. Si la valeur est zéro, cela signifie qu'on n'a jamais tiré ce numéro, et on note qu'on l'a déjà tiré en mettant la valeur à 1 (c'est ce que fait le code implicitement après le
Lors d'un prochain tirage, en accédant directement avec l'index à la position du tableau correspondant au numéro tiré, on sait immédiatement que le numéro a déjà été tiré si on constate que le contenu vaut 1 (et on refait un tirage, c'est ce que fait le
Cela évite d'avoir à parcourir
C'est, en fait, une sorte de table de hachage.
Note aussi que, dans ton code
Enfin, tu devrais mettre
Dal
Le 2ème tableau, comme indiqué par le commentaire, permet de savoir (rapidement) si le numéro a déjà été tiré.
Lors de la déclaration
int num[MAX]={0};, le tableau est mis à zéro.
Lorsqu'un numéro est tiré, le numéro tiré est utilisé comme index du tableau. Si la valeur est zéro, cela signifie qu'on n'a jamais tiré ce numéro, et on note qu'on l'a déjà tiré en mettant la valeur à 1 (c'est ce que fait le code implicitement après le
while).
Lors d'un prochain tirage, en accédant directement avec l'index à la position du tableau correspondant au numéro tiré, on sait immédiatement que le numéro a déjà été tiré si on constate que le contenu vaut 1 (et on refait un tirage, c'est ce que fait le
while).
Cela évite d'avoir à parcourir
int tab[MAX]pour vérifier, à chaque tirage, si le même numéro ne sort pas. Cette instantanéité de la vérification est au prix d'un espace mémoire double de celui normalement nécessaire.
C'est, en fait, une sorte de table de hachage.
Note aussi que, dans ton code
srand(time(NULL));devrait être à l'extérieur de la boucle
for. Une seule initialisation du générateur de nombres aléatoires devrait être faite.
Enfin, tu devrais mettre
#include <stdio.h>pour ton
printf.
Dal
10 déc. 2013 à 15:46
10 déc. 2013 à 15:50
10 déc. 2013 à 16:01
10 déc. 2013 à 16:14
Modifié par [Dal] le 10/12/2013 à 16:41
c'est pas "plus aléatoire" si tu réinitialises le générateur à chaque tirage ?
En théorie oui, si un temps suffisant s'écoule entre deux appels à srand. En pratique, la réponse prudente est donc : non.
On passe à srand un entier permettant d'initialiser le générateur de nombre aléatoire (la "seed" qui est le "s" dans - "graine aléatoire"). Pour une même "graine", le générateur de nombres aléatoires produira toujours la même séquence de nombres, car le même algorithme du générateur de nombres "aléatoires" sera utilisé sur la même valeur de départ.
Or, pour initialiser , on utilise en général , qui renvoie le nombre de secondes depuis epoch (00h00, 01-01-1970 UTC), comme c'est le cas dans ce code.
Cela a pour conséquence que tant qu'une seconde ne s'est pas écoulée, la réinitialisation de srand se fait avec la même valeur, et donc l'appel consécutif à rand() produira toujours le même chiffre.
Dal