Partage
  • Partager sur Facebook
  • Partager sur Twitter

Nombre aléatoire jusqu'à 1 millions

    15 février 2019 à 14:53:31

    Bonjour j'essaye de générer des nombres aléatoires entre 1 et 1.000.000 mais visiblement le nombre généré se situe entre 1 et 40000.
    je ne vois pas où est mon erreur si quelqu'un en voit une.

    unsigned long IndiceJackpot=0,i,randNum;
            srand(time(0));
        for(i=0;i<1000000;i++){
            randNum=rand()%1000000+1;
            printf("%lu\n",randNum);
            if(randNum>=1&&randNum<=4){
                IndiceJackpot=i;
                i=i+1000000;
            }
        }

    Merci de votre aide :)


    EDIT:

    Bonjour, après de longue recherche j'ai vus que cela été liée au rand_max.

    J'ai donc crée a propre fonction pour générer mes nombre aléatoires:

    unsigned long RandMil(void){
    unsigned short max100;
    unsigned long million;
    do{
    max100=(rand()%100)+1;
    million=((rand()%10000)+1)*(max100);
    }
    while(!(million>=1&&million<=1000000));
    
    return million;
    }

    Mais je ne sais pas si cela marche vraiment car les valeurs lors des tests ne me semblent pas cohérentes.


    -
    Edité par Neiox 15 février 2019 à 15:40:30

    • Partager sur Facebook
    • Partager sur Twitter
      15 février 2019 à 15:41:30

      Lu'!

      Documentation de rand : https://en.cppreference.com/w/c/numeric/random/rand .

      Documentation a écrit:

      Returns a pseudo-random integer value between 0 and RAND_MAX (0 and RAND_MAX included).

      Documentation de RAND_MAX : https://en.cppreference.com/w/c/numeric/random/RAND_MAX .

      Neiox a écrit:

      This value is implementation dependent. It's guaranteed that this value is at least 32767.

      A partir de là, si tu veux vraiment pouvoir générer plus grand, il va te falloir regarder quelle est la valeur exacte de RAND_MAX sur ta machine (tu peux la voir avec un print par exemple) et te servir de cette connaissance pour générer un nombre plus grand, par exemple en multipliant deux nombres aléatoires successivement choisis.

      • Partager sur Facebook
      • Partager sur Twitter

      Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

        15 février 2019 à 15:55:20

        C'est ce que j'ai fait donc mon édit :)

        Mais il ne semble pas que les nombres aient tous la même probabilité de sortir.

        Du coup je m'interroge si je ne pas fait une erreur.

        Merci de ta réponse.

        • Partager sur Facebook
        • Partager sur Twitter
          15 février 2019 à 16:00:34

          Neiox a écrit:

          Mais il ne semble pas que les nombres aient tous la même probabilité de sortir.

          Go calcul :) (promis, c'est pas très compliqué).

          • Partager sur Facebook
          • Partager sur Twitter

          Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

            15 février 2019 à 16:19:50

            Je ne comprends pas du tout ce qu'il faut faire.

            Je génère deux nombres aléatoires et le cas où les deux nombres sont au max cela fait un million.

            Donc je ne vois pas trop les maths à faire le dedans :3 .

            Si tu peux m'éclairer je veux bien 

            • Partager sur Facebook
            • Partager sur Twitter
              15 février 2019 à 16:26:09

              Neiox a écrit:

              Donc je ne vois pas trop les maths à faire le dedans :3 .

              Bah tu le dis toi même "ça a pas l'air très aléatoire". Il y a bien une raison quelque part :) . Et il faut juste regarder ce que fais ton modulo en fonction de la valeur reçue. Et vu que tu fais deux fois ce modulo pour obtenir le résultat, c'est encore amplifié.

              Mais sinon, tu te compliques : fais une fonction qui se contente de faire un nombre de deux fois plus de bits. Et puis après, fais en une qui produit ton modulo. Tu auras toujours une perte d'aléatoire mais ça ce sera moins flagrant.

              PS : les maths, c'est un peu ce qu'on fait en permanence avec un ordinateur, c'est juste une grosse machine à calculer.

              • Partager sur Facebook
              • Partager sur Twitter

              Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

                15 février 2019 à 17:16:49

                Salut,

                Le modulo déséquilibre la probabilité, mais plus le nombre passé est grand par rapport au modulo, moins c'est grave.

                Ce que tu peux faire, c'est avant tout de générer un nombre aléatoire très grand, puis ensuite de faire un modulo.

                RAND_MAX est trop petit alors fait :

                int grandnombre = rand() + (rand()*RAND_MAX);

                Normalement, ce grand nombre doit être équiprobable, et grand (environ 32 000^2 ~ 1 milliard)

                Donc après :

                int a = grandnombre%1000000;

                doit être à peu près équiprobable.



                -
                Edité par Fvirtman 15 février 2019 à 17:17:04

                • Partager sur Facebook
                • Partager sur Twitter

                Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                  15 février 2019 à 20:50:18

                  La valeur RAND_MAX est inclue dans ce que retourne rand(), les valeurs équiprobables sont donc plutôt :
                  int grandnombre = rand() + rand()*(1+RAND_MAX);
                  • Partager sur Facebook
                  • Partager sur Twitter

                  En recherche d'emploi.

                    15 février 2019 à 21:07:14

                    Ah en effet, je pensais qu'on allait de 0 à RAND_MAX-1, mais je viens de vérifier tu as raison.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                    Nombre aléatoire jusqu'à 1 millions

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown