Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme fonction random

    27 octobre 2019 à 12:11:17

    elle est pas terrible la fonction rand de time.h parce que si je genere deux nombres aleatoire dans la meme seconde, les nombres sont les memes.

    je suis obligé de faire un sleep(1) apres le rand pour avoir un nouveau nombre a la generation suivant.

    il y a pas une autre fonction de mieux ?

    • Partager sur Facebook
    • Partager sur Twitter
      27 octobre 2019 à 13:04:22

      La fonction rand, n'est pas de time.h et si elle te renvoi deux fois le même nombre dans la même seconde, c'est que tu ne sais pas l'utiliser !
      • Partager sur Facebook
      • Partager sur Twitter
        27 octobre 2019 à 13:10:49

        Luzwitz a écrit:

        elle est pas terrible la fonction rand de time.h parce que si je genere deux nombres aleatoire dans la meme seconde, les nombres sont les memes.

        N'aurais-tu pas initialisé deux fois dans la même seconde le générateur de nombres aléatoires (srand) ? Celui-ci ne doit être appelé qu'une seule fois, au tout début, justement pour éviter ce genre de problème.

        • Partager sur Facebook
        • Partager sur Twitter
          31 octobre 2019 à 18:21:33

          Les programmes qui utilisent la fonction rand ou toute autre interagissent habituellement avec un humain et le temps passe d'une seconde à une autre entre les réinitialisations.

          Il nous faudrait une fonction de temps précise au milième de seconde, par exemple.

          Et encore là, si ton programme exécute assez peu entre les séquences, tu te retrouves encore avec le même problème.

          Ça nous prendrait un registre branché sur l'horloge de l'ordi.

          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            1 novembre 2019 à 12:09:29

            Les programmes qui utilisent la fonction rand ou toute autre interagissent habituellement avec un humain et le temps passe d'une seconde à une autre entre les réinitialisations.

            Pas forcément. Par exemple il y a des programmes qui effectuent du calcul numérique avec des méthodes de type Monte-Carlo, donc utilisant de nombreux (~millions) nombres aléatoires par seconde. Justement, le mécanisme qu'utilise le C est adapté : une fois le générateur de nombres aléatoires initialisé, l'appelle à 'rand' va produire une série de nombres pseudo aléatoires, et ce indépendamment du temps passé. Même dans ce contexte, je trouve qu'il n'est pas nécessaire d'initialiser le générateur avec plus de précision. (Je me doute que les programmes basés sur du Monte-Carlo utilisent des générateurs de nombres aléatoires plus sophistiqués, je parlais juste du principe.)

            Et encore là, si ton programme exécute assez peu entre les séquences, tu te retrouves encore avec le même problème.

            Pas si le problème vient de ce que le générateur de nombres aléatoires a été appelé deux fois dans la même seconde, puisque c'est une erreur de procéder ainsi.

            -
            Edité par robun 1 novembre 2019 à 12:12:14

            • Partager sur Facebook
            • Partager sur Twitter
              1 novembre 2019 à 14:14:00

              Effectivement, tu n'est pas obligé de réinitialiser la séquence à chaque fois. Tu continues là où tu étais rendu.
              Pour le côté sophistiqué, j'ai commencé à regardé la possibilité d'avoir un intervalle plus ggrand que la normale. Je crois que rand parcourt 65536 nombres. Je pense qu'il est possible d'aller jusqu'à environ 4 milliards si on fonctionne avec des long long.
              Ici, on a une "probabilité" égale ou uniforme pour tous les nombres. Je n'ai pas étudié les situations non uniformes.
              J'avais pensé a appliquer des fonctions comme asin() ou acos() si on produit un nombre en double dans l'intervalle [0, 1) ou [-1, +1).
              Si tu applique sin() pour un angle aléatoire dans l'intervalle [0, PI) et que tu mets le résultat à une certaine puissance, tu obtiens une sorte de "cloche".
              Tu n'obtiendras pas une distribution uniforme dans l'intervalle[0, 1)
              Si ta puissance s'approche de 0, tu favorise les nombres près de 1. Si ta puissance est nettement supérieure à 1, tu favorise les nombres près de 0.
              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

                2 novembre 2019 à 18:19:41

                Le principe de rand ou toute fonction du genre est simple.

                Soit p un nombre premier, m un multiplicateur, s une semence.

                Il faut que p soit premier pour que le modulo ne donne jamais 0.

                Ce m'est pas une obligation que p soit une puissance de 2 +/- (±) 1.

                C'est s qu'on change avec srand().

                Il faut 2 <= m < p et 1 <= s < p.

                On fait s = (m*s) % p

                C'est s qui est retourné par rand()

                Il faut que le produit m*s ne soit pas trop grand et que le modulo soit possible.

                La limite est (p-1)*(p-1)

                Mon expérience me montre que le résultat est meilleurs (semble plus aléatoire) si cbrt(p) <= m <= sqrt(p).

                Si on veut une valeur r double:

                r = (double)(s-1) / (double)(p-1)

                donc 0 <= r < 1. D'où l'intervalle semi-ouvert [0, 1)

                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                probleme fonction random

                × 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