Pseudozufallsgenerator

OP #1089632
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
OP #1089651
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
}
Gast #1089659
>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.
OP #1089664
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.