Go Down

Topic: Unerwartetes Verhalten bei randomSeed(0) (Read 697 times) previous topic - next topic

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.
Ausprobieren kann das jeder mit folgendem kleinen Programm
Code: [Select]

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

markbee

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
XBee blog: http://lookmanowire.blogspot.com/

erni-berni

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.

JuergenR

#3
Dec 04, 2012, 04:24 pm Last Edit: Dec 04, 2012, 08:00 pm by JuergenR Reason: 1
Hallo Reinhard,

dann schick doch gleich eine fest definierte Zahlenfolge.

Grüße,
Jürgen

erni-berni

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

mde110

kannst ja auch i++ senden. Nicht viel zu tippen und immer def. Reihenfolge ;-)

erni-berni

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

olikraus

Wobei ein LCG Zufallszahlengenerator auch schnell selbst geschrieben ist:

Code: [Select]
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: http://en.wikipedia.org/wiki/Linear_congruential_generator

Grüße,
Oliver

uwefed


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
Code: [Select]
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

erni-berni

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.

Go Up