La fonction rand

Fermé
FirstSalem - 29 janv. 2013 à 23:01
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 31 janv. 2013 à 03:27
Bonjour,

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

2 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 29/01/2013 à 23:14
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
0
que faire alors ?
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 29/01/2013 à 23:28
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.

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)
0
Sachant que i est de l'ordre du 100 millième, j'ai finalement mis ça pour garder l'équiprobabilité :
k=100*((rand() % ((i/100) - 0 + 1)) + 0)+((rand() % (99 - 0 + 1)) + 0)+1;
c'est bon a votre avis ?
merci
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
31 janv. 2013 à 00:07
i/100 vaut 0. De plus il ne faut pas utiliser le modulo avec rand() pour assurer l'équiprobabilité. Donc assurément non !
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
31 janv. 2013 à 00:26
Pour ma part, quand je parlais d'assurer l'équiprobabilité je pensais uniquement à la partie (RAND_MAX+1)*rand()+rand(), il est évident qu'il y a un biais avec le %i et que les probabilité d'avoir i-1 sont moindres que les autres, mais c'est également le cas avec le rand() tout seul...
0
non, i/100 ne vaut pas 0
0