Le Random() pas si random ?

Bonsoir,

Je cherche a générer un bruit via un buzzer avec un certain delay entre le moment ou j'appuie sur un bouton et le moment ou ça sonnera.

Je me suis donc penché sur la fonction delay().
Et je souhaite avoir un delay qui varie entre 1 et 5 secondes.
J'ai donc mis

delay(1000,5000);

ça me génère bien des nombres aléatoires entre 1000 et 5000, nickel ...

Sauf qu'en répétant mes essais, j'ai remarqué que la suite de nombres aléatoire est toujours rigoureusement la même.
Dans mon cas :

3807
1749
4573
2158

J'ai refais plusieurs fois et c'est toujours la même suite.
Je n'ai pas trouvé d'explications dans la description de la fonction, et j'ai rien trouvé de tel dans les topics qui traitent de la fonction random.

voici la partie du code qui gère ça :

void loop()
{
  etatbouton=digitalRead(pinBouton);//récupère l'état du bouton
  if (etatbouton==HIGH)//si bouton appuyé
  {
   digitalWrite(ledPin,!digitalRead(4)); //changer l'état de la led
   randNumber=random(1000,5000); 
   Serial.println(randNumber);
   delay(randNumber);
   deb=millis();
  tone(buzzer,2000); //BIP
  delay(500);
  noTone(buzzer);//fin du BIP
  
  }

Le bouton est branché sur une entrée digitale qui ne gère pas les interruptions (normalement je devrais le faire avec une interruption, mais j'aurais besoin de mes entrée qui gèrent les interruptions par là suite.
Avez déja été confrontés a ce problème ?

Bonjour , pour le random , il y a une fonction qui fait ça regarde ici :

ewaca:
Avez déja été confrontés a ce problème ?

bonsoir
8)
Le pseudo generateur "aleatoire" doit etre initialisé
et rien n'empeche sa réinitialisation 8)

voir randomSeed() - Arduino Reference

Je pense que le pus simple est d'utiliser la librairie TrueRandom: elle initialise le générateur aléatoire avec ce que fournit l'ADC de l"Arduino

https://github.com/sirleech/TrueRandom

Je l'utilise souvent, elle est très simple à mettre en oeuvre.

Bonjour,
J’avais vu une astuce qui consistai à générer un nombre avec "random(min, MAX)" et le multiplier par la lecture d'une entrée analogique non utilisé (le bruit de fond de l'entrée faisant office de nombre aléatoire).

Attention : il y a aléatoire et aléatoire !

Les plus communément utilisées sont des variables "pseudo-aléatoire". Elles sont construites à partir d'un polynôme générateur. Cela veut dire que la séquence de nombres a un longueur finie et qu'au bout de ce temps, la séquence reprend les mêmes valeurs. La longueur dépend du polynôme générateur. En général, ce polynôme est choisi pour que la séquence soit suffisamment longue et surtout, pour que toutes les valeurs soient équiprobables.

Leurs défauts dans les implémentations est que, si on ne les initialisent pas, elles partent toujours de la même valeur, et donc on déroule toujours la même suite, ce qui n'est plus très aléatoire. Mais globalement, elles possèdent toutes une procédure d'initialisation pour pallier ce problème.

Il y a maintenant les vrais variables aléatoires. Elles sont généralement issues de prises en compte d'un phénomène lui même aléatoire (le bruit électronique par exemple). C'est très bien, la séquence ne sera jamais la même. Pour autant, elles présentent le défaut que n'ont pas les séquence pseudo-aléatoires : leur distribution n'est souvent pas uniforme, elle peut être gaussienne, poisson, ... être centrée ou pas, ...

C'est donc à l'utilisateur de faire son choix en fonction de l'importance qu'il attribue à chacun de ces critères.

Tout cela peut paraître abstrait. Un exemple, celui d' "ewaca" précisément.

En pseudo-aléatoire : toutes les durées sortiront de manière équi-probables, mais se répéteront au bout d'un certain temps ( longueur > 10000 minimum)

En vrai aléatoire, la séquence ne sera jamais la même, mais "probablement" que certaines valeurs sortiront plus souvent que d'autres..

Cordialement.

Pierre