Suite de nombres aléatoires périodique ? fonction Rnd

Bonjour.

Je n'ai rien trouvé sur le forum ou sur le net concernant un problème que je viens de rencontrer.

Pour le contexte, j'ai voulu me faire un 2048 sous VBA (parce que c'est le language que je maitrise le mieux) et puis parce que je souhaitais faire un travail statistique par la suite et ajouter d'autres fonctionnalités.

Le jeu en lui-même est parfaitement reproduit et ensuite, je me suis attelé à faire des algorithmes de résolutions automatiques pour ensuite les comparer. Le premier est une résolution totalement aléatoire, puis ça devient de plus en plus travaillé.

Mon problème provient de la fonction Rnd que j'utilise pour générer le numéro (2 ou 4) qui apparait à la fin de chaque tour dans une case vide aléatoire. Quand je fais défiler le programme en pas à pas en m'arrêtant entre chaque parties, je constate que le nombre de tours joué varie d'une partie à l'autre ce qui est normal et attendu mais lorsque je fais défiler toutes les parties à la suite sans interruption et en faisant en sorte que le calcul soit le plus léger possible (désactivation de l'affichage,...) je constate que quelque fois, j'ai des séries de 4 parties qui possèdent exactement les mêmes résultats de fin de partie (nombre de tours, score, matrice finale,...) alors que c'est totalement improbable et que ça n'arrive jamais quand je fais des interruptions entre chaques parties pour contrôler.

Je ne vois pas tellement l'utilité de poster le code ici puisque j'ai pu vérifier que le problème ne venait d'erreurs d'écriture ou d'algorithmes mais si des gens sont intéressés, je suis disposé à le partager.

Le problème vient vraisemblablement de la fonction aléatoire qui me sort des séries de nombres aléatoires pas si aléatoirement que cela. Est-ce que des personnes auraient pu rencontrer ce genre de problème et est-ce que cela ne proviendrait pas d'une surcharge des capacités de calcul de l'ordinateur lors de l'éxécution du programme ?

bonsoir,

utilises-tu l'instruction randomize dans to programme ? sinon je te conseille de le faire

si tu veux reproduire une même séquence de nombres aléatoires

randomize numero_de_la_sequence

ou avoir à chaque fois des séquences aléatoires

randomize

J'utilise la fonction Rnd. Mais mon but est d'avoir de l'aléatoire alors que visiblement, la succession de fonction Rnd reproduit les mêmes valeurs et la série se repète quatre fois d'affilée. Ca n'a pas de sens. La fonction Rnd est bien basée sur une fonction polynomiale de haut degrés et sur l'horloge interne du pc ?

Bonjour,

et sur l'horloge interne du pc ?

A condition d'avoir mis l'instruction Randomize (sans paramètre) au début comme te l'a indiqué h2so4.

Tu n'as pas répondu à sa question.

eric

Oui, j'utilise Rnd sans paramètres. D'ailleurs, certaines parties qui se suivent sont bien différentes mais quelques fois, j'ai des séries de 4 parties identiques qui ne peuvent s'expliquer que par l'aléatoire qui me sort des séries identiques de nombres.

bonjour

pour ajouter encore un paramètre hyper aléatoire, fais intervenir le joueur (celui qui clique sur le clavier ! )

dans ton calcul, utilise la variable de l'horloge interne du système à l'instant du clic.

par exemple, tu multiplies un de tes calculs par la seconde (dernier chiffre du temps)

ceci vient en complément de la fonction randomize

rem : si tu disposes d'un capteur (température, bruit etc) sur port USB, tu peux de même utiliser le dernier chiffre qu'il te donne (à condition que ce soit un chiffre lié au "bruit de fond" du signal, donc un chiffre hyper variable et non le second chiffre de la température qui lui varie peu)

Merci de la réponse, je vais creuser cela. Ca voudrait dire que le problème viendrait du fait qu'il rentre la même valeurs d'entrée dans sa fonction aléatoire et qu'à fortiori, la fonction me donne la même valeur de sortie. Mais toutefois, j'ai du mal à croire que ça puisse se faire sur quelque chose comme 500 utilisations de la fonction aléatoire consécutivement. Le problème semble aussi intervenir parce que le programme s'effectue plus rapidement. Est-ce que quelqu'un sait quelle est la plus petite unité de temps qui intervient dans la valeur d'entrée de la fonction Rnd ?

A ce moment-là, il faudrait que je trouve un moyen pour qu'à la suite de deux utilisations de Rnd identiques, les calculs ne s'effectuent pas exactement dans la même période jusqu'à la prochaine utilisation de la Rnd. Mais au final, j'en reviens toujours à utiliser la fonction Rnd.

Tu réponds à coté de la question.

On te dit de mettre Randomize en début de procédure, tu réponds "oui j'utilise rnd()"

Randomize est une autre fonction que Rnd(), regarde l'aide dessus.

pour ajouter encore un paramètre hyper aléatoire aléatoire, fais intervenir le joueur (celui qui clique sur le clavier ! )

dans ton calcul, utilise la variable de l'horloge interne du système à l'instant du clic.

Randomize sans paramètre utilise déjà le timer. L'utiliser une 2nde fois n'ajoute donc pas d'aléatoire.

eric

Bonjour,

Sujet intéressant, j'utilise beaucoup Alea().

Eric a raison, il faut initialiser RND avec Randomize. Ensuite le nombre suivant est généré à partir du nombre précédemment calculé et ainsi de suite...

Microsoft Basic part de la formule: x1 = ( x0 * a + d ) MOD 2^24

les variables égalent :

x 1 = nouveau n°

x0 = n° précédent

U = 214013

d = 2531011

En initialisant avec Int(2 ^ 24 * Time) la suite sera indentique à la même heure.

a+

Ah ok, excusez moi, je n'ai pas réalisé que Rnd() était différent de Randomize(). Je vais tester cela.

J'ai utilisé la fonction Randomize avant chaque appelle de Rnd et j'obtiens encore des suites de résultats identiques. Je ne comprends plus rien. J'ai l'impression que le problème vient d'un algorithme de résolution en particulier. Je vais devoir contrôler toute l'exécution de mon algorithme pas à pas :/

JJ1 a écrit :

Bonjour,

Sujet intéressant, j'utilise beaucoup Alea().

Eric a raison, il faut initialiser RND avec Randomize. Ensuite le nombre suivant est généré à partir du nombre précédemment calculé et ainsi de suite...

Microsoft Basic part de la formule: x1 = ( x0 * a + d ) MOD 2^24

les variables égalent :

x 1 = nouveau n°

x0 = n° précédent

je suppose que c'est a = 214013

d = 2531011

En initialisant avec Int(2 ^ 24 * Time) la suite sera indentique à la même heure.

a+

je ne comprends pas comment une suite définie :

  • par un début aléatoire (c'est bien pour démarrer)
  • mais suivi par une formule sans aucun nombre aléatoire dedans
peut être considérée comme aléatoire

? ? ?

Bonjour,

je ne comprends pas comment une suite définie :

  • par un début aléatoire (c'est bien pour démarrer)
  • mais suivi par une formule sans aucun nombre aléatoire dedans
peut être considérée comme aléatoire

? ? ?

Tout simplement parce que rnd() a été conçu pour ça, voir aide sur cette fonction.

Mais ça reste du pseudo-aléatoire, bien suffisant pour la totalité de nos besoins.

eric

J'ai finalement dénicher le problème. Rien à voir avec l'aléatoire de mon algorithme. Le problème venait du fait que suivant comment se terminait certaines parties, l'enregistrement des données de cette dernière se faisait une ou quatre fois tout en incrémentant la variable indiquant que je passais à la partie suivante. Ainsi, je remplissais mon tableau de résultat avec plusieurs fois les données d'une même partie.

Désolé pour le dérangement en tout cas :/

Il n'empêche que tu dois quand même mettre randomize au début du code.

Sinon tu redémarreras toujours avec la même séquence.

eric

eriiic a écrit :

Bonjour,

je ne comprends pas comment une suite définie :

  • par un début aléatoire (c'est bien pour démarrer)
  • mais suivi par une formule sans aucun nombre aléatoire dedans
peut être considérée comme aléatoire

? ? ?

Tout simplement parce que rnd() a été conçu pour ça, voir aide sur cette fonction.

Mais ça reste du pseudo-aléatoire, bien suffisant pour la totalité de nos besoins.

eric

OK

merci

Rechercher des sujets similaires à "suite nombres aleatoires periodique fonction rnd"