La fonction rand
FirstSalem
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
i étant un nombre aux alentours de 300000, je fais un
je n'obtiens que des k de l'ordre de 10000, 20000... même en bouclant le rand 100 fois (et en affichant le k généré), je ne remarque pas de nombres plus grands que 20000
Est-ce normal?
Comment faire pour que k puisse atteindre les 300000 ?
Merci
i étant un nombre aux alentours de 300000, je fais un
k=(rand() % (i - 1 + 1)) + 1;
je n'obtiens que des k de l'ordre de 10000, 20000... même en bouclant le rand 100 fois (et en affichant le k généré), je ne remarque pas de nombres plus grands que 20000
Est-ce normal?
Comment faire pour que k puisse atteindre les 300000 ?
Merci
A voir également:
- La fonction rand
- Fonction si et - Guide
- Fonction miroir - Guide
- Fonction moyenne excel - Guide
- Fonction remplacer sur word - Guide
- Fonction somme excel - Guide
2 réponses
Il se trouve que rand() est un nombre compris entre 0 et RAND_MAX.
Donc quelque soit i, tu auras toujours au maximum k=RAND_MAX.
Or RAND_MAX vaut généralement 32767 (parfois plus), ce qui explique pourquoi tu n'obtiens que des valeurs de l'ordre de 10000, 20000, et au maximum 32767.
Remarque 1 : ton i est totalement inutile ici, vu qu'il est supérieur à RAND_MAX.
Remarque 2 : boucler 100 fois est insuffisant pour tirer une généralité sur un tirage aléatoire.La confiance n'exclut pas le contrôle
Donc quelque soit i, tu auras toujours au maximum k=RAND_MAX.
Or RAND_MAX vaut généralement 32767 (parfois plus), ce qui explique pourquoi tu n'obtiens que des valeurs de l'ordre de 10000, 20000, et au maximum 32767.
Remarque 1 : ton i est totalement inutile ici, vu qu'il est supérieur à RAND_MAX.
Remarque 2 : boucler 100 fois est insuffisant pour tirer une généralité sur un tirage aléatoire.La confiance n'exclut pas le contrôle
Tu peux tirer deux nombres aléatoires A et B, et calculer (RAND_MAX+1)*A+B.
Ça te générera alors un nombre entre 0 et (RAND_MAX+1)²-1 pour lequel i sera inférieur.
Remarque : Il faudrait vérifier mathématiquement que l'équiprobabilité est bien respectée (elle ne l'est pas par exemple sur un calcul de type A*B, mais comme ça je pense que c'est correct)
Ça te générera alors un nombre entre 0 et (RAND_MAX+1)²-1 pour lequel i sera inférieur.
k=((RAND_MAX+1)*rand()+rand()) % i) + 1;
Remarque : Il faudrait vérifier mathématiquement que l'équiprobabilité est bien respectée (elle ne l'est pas par exemple sur un calcul de type A*B, mais comme ça je pense que c'est correct)