Unerwartetes Verhalten bei randomSeed(0)

Hallo,
ich mache gerade Experimente zum Test einer Funkverbindung zwischen zwei Arduinos und wollte eine Quasi Zufallsbytefolge als Testmuster übertragen.
Dabei habe ich festgestellt, dass der Funktionsaufruf randomSeed(0) nicht bei jedem Aufruf die gleiche Folge von Zufallszahlen generiert, sondern nur beim ersten Aufruf.
Wenn ich stattdessen randomSeed(1) aufrufe, wird nach dem Aufruf auch im laufenden Programm immer wieder die gleiche Folge generiert.
Ausprobieren kann das jeder mit folgendem kleinen Programm

void setup(){
  Serial.begin(9600);
}
void loop(){
  randomSeed(0);
  Serial.println(" ");
  for (int i=0;i<256;i++) {
    long randNumber = random(255);
    Serial.print(randNumber);
    Serial.print(";");
  }
  Serial.println(" ");
  delay(1000);
}

Wenn man statt randomSeed(0) randomSeed(1) einsetzt, wird in jeder loop die gleiche Folge generiert.
Zu diesem seltsamen Verhalten konnte ich nichts in der Dokumentation finden.
Gruß
Reinhard

Ein bekanntes Problem - deswegen macht man randomSeed() auch gerne mit einer "Zufallszahl", wie z.B. dem Wert eines analogen Eingangs.

randomSeed(analogRead(0));

Reference: http://arduino.cc/en/Reference/RandomSeed

Aber ich wollte ja genau eben keine Zufallszahl sondern wollte die Wiederholbarkeit der Funktion ausnutzen, um auf der Empfangsseite zu testen, ob die Folge korrekt ankommt.

Hallo Reinhard,

dann schick doch gleich eine fest definierte Zahlenfolge.

Grüße,
Jürgen

Super Idee! (..wär ich nicht drauf gekommen...)
ich wollte mir ja nur das eintippen sparen :wink:

kannst ja auch i++ senden. Nicht viel zu tippen und immer def. Reihenfolge :wink:

leider sind dann die Bits im Datenstrom nicht besonders zufällig verteilt

Wobei ein LCG Zufallszahlengenerator auch schnell selbst geschrieben ist:

uint8_t z = 0;
uint8_t lcg_rnd(void)
{
  z = (uint8_t)((uint16_t)65*(uint16_t)z + (uint16_t)17);
  return z;
}

Die Sequenz wiederholt sich nach 256 Zahlen (nämlich dann, wenn alle 8 Bit Zahlen mal dran waren), die Zahlen selbst sind gleichverteilt.

Siehe auch hier: Linear congruential generator - Wikipedia

Grüße,
Oliver

erni-berni:
Hallo,
ich mache gerade Experimente zum Test einer Funkverbindung zwischen zwei Arduinos und wollte eine Quasi Zufallsbytefolge als Testmuster übertragen.
Dabei habe ich festgestellt, dass der Funktionsaufruf randomSeed(0) nicht bei jedem Aufruf die gleiche Folge von Zufallszahlen generiert, sondern nur beim ersten Aufruf.
Wenn ich stattdessen randomSeed(1) aufrufe, wird nach dem Aufruf auch im laufenden Programm immer wieder die gleiche Folge generiert.

In arduino1.0.2\hardware\arduino\cores\arduino\WMath.cpp
steht

void randomSeed(unsigned int seed)
{
  if (seed != 0) {
    srandom(seed);
  }
}

Praktisch bei null wird kein neuer Wert gesetzt sondern mit der alten Folge weitergemacht. Frag mich aber nicht wieso.
Grüße Uwe

Danke Uwe, das ist die Erklärung und offensichtlich so gewollt.
In meiner genutzten V1.0 ist der Programmabschnitt übrigens auch so.
Wenn man das Verhalten kennt, kann man das ja evtl bewusst so einsetzen.