La fonction rand

FirstSalem -  
KX Messages postés 19031 Statut Modérateur -
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

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
  2. FirstSalem
     
    que faire alors ?
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      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
    2. Salem
       
      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
    3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      i/100 vaut 0. De plus il ne faut pas utiliser le modulo avec rand() pour assurer l'équiprobabilité. Donc assurément non !
      0
    4. KX Messages postés 19031 Statut Modérateur 3 020
       
      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
    5. Salem
       
      non, i/100 ne vaut pas 0
      0