Pseudozufallsgenerator

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren