Forum: Mikrocontroller und Digitale Elektronik Pseudozufallsgenerator


von Paul H. (powl)


Lesenswert?

Hi!

Für ein Flackerlicht brauche ich einen Pseudozufall der mir Werte von 0 
bis 255 mit möglichstgleicher Wahrscheinlichkeit ausgibt.

Hat ein LFSR eine gleichmäßige Wahrscheinlichkeitsverteilung oder ist 
das auch eher schlecht? Gibts noch was besseres?

lg PoWl

von Sachich N. (dude) Benutzerseite


Lesenswert?

Reicht

von Melanie (Gast)


Lesenswert?

Zum flackern wird sicher eine Schiebregister mit EXOR geeinet sein.
Null kommt allerdings nicht vor.

von Paul H. (powl)


Lesenswert?

Hi,

hätte ich einfach mal gemacht als gleich wieder theoritisiert hätte ich 
mir den Thread sparen können:

Hier mal mein speicherplatzfressender aber funktionierender Code:
1
uint8_t random()
2
{
3
  static uint32_t random = 0b10111011101100111101001100101011;
4
5
  uint8_t result;
6
7
  for(uint8_t i=0; i<8; i++)
8
  {
9
    // Letze Ziffer in Result übernehmen
10
    result = random << 32;
11
    result <<= 1;
12
13
    // Schieberegister eins weiter schieben
14
    random >>= 1;
15
16
    // Mehrere XOR-Verknüpfungen und neue Zufallsziffer berechnen
17
    random ^= (random << 1) & (1UL << 1);
18
    random ^= (random << 2) & (1UL << 2);
19
    random ^= (random << 5) & (1UL << 5);
20
    random ^= (random << 8) & (1UL << 8);
21
  }
22
}

von HildeK (Gast)


Lesenswert?

>Hat ein LFSR eine gleichmäßige Wahrscheinlichkeitsverteilung oder ist
>das auch eher schlecht?
Bei einem LFSR der Länge n kommt jeder der 2^(n-1) Werte genau einmal 
vor, in einer vom Rückkopplungspolynom festgelegten Folge, die in sich 
quasi zufällig ist aber sich nach Ablauf einer Periode exakt wiederholt. 
Wie schon bemerkt, fehlt die Null (oder wenn du alles invertierst, fehlt 
eben das Wort mit den n Einsen). Für n=8 erhälst du also 'nur' 255 
Werte.

>Gibts noch was besseres?
Ja, weiße, analoge Rauschquelle digitalisieren.

Vielleicht ist auch schon eine Vergrößerung von n hilfreich, wobei du 
weiterhin nur 8 Bit zur Auswertung heranziehst.
Ohne den Grund zu kennen: in der Praxis begegneten mir immer nur Folgen 
mit n=7, 15, 21 usw.

von Paul H. (powl)


Lesenswert?

Dass die 0 nicht dabei ist macht nix.

Ich sehe grad dass mein Code n Fehler hat.
1
    random ^= (random << 1) & (1UL << 1);
2
    random ^= (random << 2) & (1UL << 2);
3
    random ^= (random << 5) & (1UL << 5);
4
    random ^= (random << 8) & (1UL << 8);

da würde jede zeile bewirken, dass random komplett mit einer stelle 
eines verschobenen random registers xor-verknüpft wird. ist irgendwie 
schwachsinnig.

eigentlich wollte ich sowas in der art
1
    random ^= (random << (32 - 1)) & 1;
2
    random ^= (random << (32 - 2)) & 1;
3
    random ^= (random << (32 - 5)) & 1;
4
    random ^= (random << (32 - 8)) & 1;

damit werden allerdings immernoch alle ziffern xor-verknüpft.. wie mach 
ich das, dass nur die erste xor-verknüpft wird? jedesmal noch ein | 
random dazu?
1
    random ^= ((random << (32 - 1)) & 1) | (random & !(1));
2
    random ^= ((random << (32 - 2)) & 1) | (random & !(1));
3
    random ^= ((random << (32 - 5)) & 1) | (random & !(1));
4
    random ^= ((random << (32 - 8)) & 1) | (random & !(1));

Das sieht kompliziert aus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.