Pages: [1]   Go Down
Author Topic: Unerwartetes Verhalten bei randomSeed(0)  (Read 520 times)
0 Members and 1 Guest are viewing this topic.
Cologne
Offline Offline
Sr. Member
****
Karma: 11
Posts: 496
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
 
Logged

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 6
Posts: 291
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Cologne
Offline Offline
Sr. Member
****
Karma: 11
Posts: 496
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Heilbronn
Offline Offline
Full Member
***
Karma: 4
Posts: 148
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Reinhard,

dann schick doch gleich eine fest definierte Zahlenfolge.

Grüße,
Jürgen
« Last Edit: December 04, 2012, 02:00:34 pm by JuergenR » Logged

Cologne
Offline Offline
Sr. Member
****
Karma: 11
Posts: 496
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany, BW
Offline Offline
Sr. Member
****
Karma: 3
Posts: 294
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Arduino 1.0.3|MEGA|UNO|MICRO|PRO MINI3.3
SSD1289 TFT Touch|DS18B20|DS1307
ADNS2610|RFM12|OOK|SSD1303|DHT22
SSD1306 Crius CO-16 OLED|UGUI|SD
SSD1352|

Cologne
Offline Offline
Sr. Member
****
Karma: 11
Posts: 496
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany
Offline Offline
Edison Member
*
Karma: 133
Posts: 1444
If you believe something is right, you won't see what's wrong (David Straker).
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wobei ein LCG Zufallszahlengenerator auch schnell selbst geschrieben ist:

Code:
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
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21243
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
Logged

Cologne
Offline Offline
Sr. Member
****
Karma: 11
Posts: 496
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: