[Gelöst] Random noch Zufälliger Machen

N Abnd,

in einem "kleinen" Led Projekt nutze ich öftersmal random() oder auch random8() von FastLED.

Mit randomSeed() wollte ich das ganze noch zufälliger machen. der Codeschnipsel steht nur in setup()

random16_add_entropy( random());
  randomSeed(random16());
  random16_add_entropy( random());
  dist = random(random8())*random16();

Jedoch ist mir trotzdem aufgefallen, dass zumindest bei jedem einschalten die Leds das selbe anzeigen, obwohl deren Animation viele random() aufrufe macht.

Kann ich denn auch wärend loop() funktionen wie randomSeed(analogRead(A0)); aufrufen und an dem analogen Pin ein Drahtstücken anlöten?

Gruße

randomSeed sollte mit einem wirklich (halbwegs) zufälligen Wert "gesät" werden, z.B. millis(), oder auch analogRead(A0), wenn dieses nicht anderweitig benutzt wird (auch ohne Draht) - oder der Summe aus beiden.
Danach nur noch random benutzen, ohne weitere randomSeed.

Aus meiner Wühlkiste:

long seed(byte pin)
{
 long  result = 0;
  for(int i=0;i<32;i++) 
  {
    int a = analogRead(pin);
    //Serial.println (a);
    result = (result << 1) | (a & 1);
  }
  return result;
}


void setup() 
{
   Serial.begin(9600); 
   randomSeed(seed(A0));
}

void loop() 
{
  Serial.println (seed(A0),BIN);
  delay(3000);
}

Und ja, eine kurze Antenne dran machen, kann man tun.

Den randomSeed() in loop() zu setzen, macht meines Erachtens nach keinen Sinn.
Das würde Wiederholungen eher fördern, als verhindern.

OK, Dankeschön, wird gleich probiert.

Random Seed aus millis() in setup() dürfte jedes mal den selben Wert haben, da bei gleicher Initialisierung immer genau gleich viel Zeit vergeht.

Vielleicht nehme ich die analogRead() Methode auch in die loop() auf, aber nicht zum "sähen" sonder zum Beispiel so: byte randomNumber = random8() * analogRead(A0);(

Ciao

nein, es vergeht nicht immer exakt genau gleich viel Zeit, und auch bei analogRead gibt es immer kleine Unterschiede.
edit: initialisiere randomSeed als letzte Aktion in setup().

Mit größerem Aufwand gibt es aber bessere PRNGs, nämlich den von Kernighan-Richtchie oder einen Mersenne Twister.
Alles probiert, alles super, je nachdem für welchen Einsatzbereich.

Random Seed aus millis() in setup() dürfte jedes mal den selben Wert haben, da bei gleicher Initialisierung immer genau gleich viel Zeit vergeht.

Da hast du vollkommen wahr.

Was man auch gut nehmen kann, ist der micros() Wert, von der ersten User Aktion.
z.B. den ersten Tastendruck.

Der Jitter zwischen einem Timer und dem Watchdog Timer ist eine gute Zufallsquelle. Da der Watchdog einen internen RC-Oszilllator hat laufen die nicht gleich:

Wenn man einen Taster hat ist auch "Zeit bis zum ersten Tastendruck" einfach

Wow,
hätte garnicht gedacht, dass Zufall ein so großes und kmoplexes Thema ist.

Von der Möglichkeit, den Benutzer als Zufallsgenerator zu nutzen (Tastendrücke, bei Smartphones auch Beschleunigungssensoren,...) hab ich auch schön gehört.

Ich habs mal eben so getestet:

  //random more random
  random16_add_entropy(analogRead(RANDOM_PIN));
  randomSeed(analogRead(RANDOM_PIN));
  random16_add_entropy( random()*analogRead(RANDOM_PIN));
  dist = random(random8()*analogRead(RANDOM_PIN))*random16()*analogRead(RANDOM_PIN);

Funktioniert super, bei jedem erneuten Einschalten leuchten die Leds komplett anders, so wies soll.

Fürs erste ist mir das einmal zufällig genug, eventuell rufe ich obigen Code beim Wechsel der Animationen auf oder nutze was von euren Vorschlägen.

Ciao!

Für LEDs reicht das sicherlich. Aber die Analog-Eingänge streuen bei weitem nicht so, dass der Zufall dabei vernünftig über den ganzen Bereich verteilt ist

Hi

Trotzdem ist es widersinnig, den seed 'laufend neu zu setzen'.

Der Seed ist eine Art Anfangswert - Du kannst auch, bis der erste Tastendruck des User ankommt, in Dauerschleife Ramdom-Zahlen ziehen lassen - dann bist Du auf jeden Fall 'immer irgendwo anders'.

Es wird Dir aber nicht helfen, alle 15 Sekunden den Seed neu zu setzen - dann bekommst DU alle 15 Minuten die Chance, wieder ein bekanntes Muster zu sehen - bei der Methode 'immer Zufallszahlen, auch wenn Keine gebraucht wird' gehen halt die bekannten Muster 'verloren' und Du bekommst zwar immer noch nachvollziehbare Zufallszahlen (wenn man denn will, man muß sich ja 'nur' merken, die wievielte Zahl man gerade zieht), aber halt immer eine Nummer dieser Zahlen.

MfG

combie:
Aus meiner Wühlkiste:

Danke, dann kann ich einen Urhebervermerk dran machen. Den Code benutze ich auch und bisher stand nur Forum dran.

Gruß Tommy

Danke für eure Antworten,

Ich verwende bis jetzt immernoch die analogRead Methode zum sähen. Und soweit schauts gut aus, bei jedem Einschalten wird mir ein anders Muster angezeigt.
Wiederholungen kann ich so noch keine feststellen.

Also für mich reichts erstmal aus. Ich werde aber andere Techniken und Combies Code mal im Hinterkopf behalten.