Fonction réellement aléatoire

Bonjour,
J'ai plusieurs cartes dont le programme identique démarre de façon synchrone.
Ce programme allume des leds de façon aléatoire .
La fonction aléatoire pour générer le choix des leds fonctionnent correctement.
Mon problème est que la fonction aléatoire génère le même résultat sur chaque carte.
Je pense que la fonction aléatoire doit être liées au temps CPU.
Existe-t-il une fonction vraiment aléatoire ?
Merci

Bonjour

la fonction random() génére un nombre "pseudo" aléatoire

pour ajouter un peu plus d'aleatoire , voir la fonction randomseed()

Le noyau de la fonction random() renvoie une succession de nombres long dont chaque valeur est obtenue avec la précédente et un petit algorithme. random() prend ce nombre et fait un modulo pour avoir un nombre compris entre deux valeurs.

randomSeed() permet de démarrer avec un long choisi, je suppose que cela fait démarre la série au milieu, ce qui fait que l'on a l'impression de plein de séries aléatoires.

Pour démarrer aléatoirement (donner une valeur à randomSeed(), il suffit de lui donner une nombre aléatoire. Mais si on ne savait pas faire une série aléatoire, on ne sait pas donner non plus un premier nombre aléatoire.

Voici quelques pistes:

  • Si on a plusieurs cartes, mais que l'on ne veut pas la même série sur aucune des cartes, mais que l'on peut se contenter qu'une carte donnée ait toujours la même série, il suffit de rajouter randomSeed(N), N étant le numéro de la carte. Dans le cas ou l'on voudrait que le programme soit le même dans toutes les cartes, il faudrait mettre la valeur de N ailleurs que dans le programme. On peut mettre le N° de carte en EEPROM par exemple. Il devrait être possible aussi d'utiliser l'heure de compilation à la place de N ( __TIME__ je crois) car si on programme deux cartes ce n'est pas en même temps
  • Certains utilisent une entrée analogique en l'air pour générer le premier nombre -> randomSeed(analogRead(A0)); si A0 est inutilisé. Mais les tests que j'ai fait montre que dans les mêmes conditions cela ne génère que quelques nombres différents. Pour deux cartes, il y a des chances que l'on n'ait pas la même série, mais pour 4 cartes, il est possible que deux aient la même.
  • Il est possible de faire démarrer le programme avec un poussoir, et le temps en microsecondes mis pour appuyer sur le bouton ne donnera pas le même temps et randomSeed(micros()); ne donnera quasiment jamais la même série. On peut remplacer le bouton par un condensateur qui se charge. La différence des condensateur suffit à avoir un temps de charge différent.
  • on peut utiliser une horloge en temps réel sur chaque carte qui va donc donner un temps différent pour chaque allumage. SI les cartes sont mises sous tension en même temps, il serait théoriquement possible que les temps d'initialisation soient le mêmes et que l'on ait la même série.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.