Quellcode für Pseudozufallsgenerator

Gast #772553
Lesenswert?

Hallo,

ich habe hier schon viel zur Therorie der Zufallszahlen gelesen, jedoch 
kein Beispiel für einen AVR gefunden. In einem Beitrag war ein Hinweis 
auf die Codesammlung, jedoch war dann dort nichts zum Thema Zufallszahl 
zu finden.
Mehrere externe Links sind nicht mehr erreichbar (2004 - 2006)

Ich möchte ohne externe Bauelemente einen Zufallsgenerator, der 
Startwert wird im EEProm gespeichert, muß also nicht extern ermittelt 
werden.

Wer kann mir einen Link zum Quellcode für einen Pseudozufallsgenerator 
schreiben?

Hardy
#772565
Lesenswert?

Hallo,

ich hatte da auch mal gesucht und wenig fertiges gefunden.

Im Anhang ist der Source meines flackernden Kaminfeuers vom 
Modellpuppenhaus meiner Frau.

Original ist irgendwo aus dem Netz, eine der vielen möglichen Varianten 
eines rückgekoppelten Schieberegisters, für meine Zwecke mehr als 
ausreichend.

Sind 2 Vaersionen drin, 15Bit und 23Bit.

Gruß aus Berlin
Michael
Angehängte Dateien:
Gast #778449
Lesenswert?

Hi,

für Controller mit MUL-Befehl kann man leicht die bekannte Formel 
SEED=181*(OLDSEED)+359 [8 bit random number=high(SEED)] benutzen, um 8 
bit Random-Werte zu erzeugen. Wenn es wichtig ist, dass beim Neustart 
des Prozessors auch "neue" Zufallszahlen erzeugt werden, muss man den 
Seed-Wert (in rndseed und rndseed+1) jeweils neu wählen, oder den 
letzten zwischenspeichern. Da der Code kurz ist, poste ich ihn direkt in 
diesem Beitrag.

Gruß

Fred
1
.equ RNDM=181    ;
2
.equ RNDA=359    ;
3

4
.def lrpl=r2
5
.def lrph=r3    ; low reg pair MSB
6

7
.def rw=r16    ; 1st working reg
8
.def rw_=r17    ; 2nd working reg  - 16bit pair, don't change 
9

10
.dseg
11
.org SRAM_START
12
rndseed: .BYTE 2    ; 16 bit seed for rnd()
13

14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
15
; rnd() returns a random number in lrph, updates rndseed; changes lrpl
16
; changes r1:r0
17
; SEED=181*(OLDSEED)+359; random number=high(SEED)
18
rnd:
19
  push rw
20
  push rw_
21
  lds rw, rndseed    ; seed LSB
22
  ldi rw_, RNDM    ; multiplicator
23
  mul rw, rw_    ;
24
  movw lrph:lrpl,r1:r0; save result
25
  lds rw, rndseed+1  ; seed MSB
26
  mul rw, rw_    ;
27
  add lrph, r0    ; add 
28
  ldi rw, low(RNDA)
29
  add lrpl,rw    ; add RNDA
30
  ldi rw, high(RNDA)  ;
31
  adc lrph,rw    ;
32
  sts rndseed, lrpl  ; save 
33
  sts rndseed+1, lrph  ;
34
  pop rw_
35
  pop rw
36
  ret
37
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#3272565
Lesenswert?

Der hier ist schön einfach; sollte fürs flackernde Kaminfeuer reichen :)

Grüße,
Ulrich
1
/**********************************************************************/
2
/** Simple pseudo random number generator.
3
 *
4
 *  \note  Based on work on Xorshift RNGs by George Marsaglia.
5
 *         This simple implementation uses y as a fixed seed.
6
 *
7
 *  \return  number in range 0..2^32-1
8
 */
9
uint32_t
10
prng( void )
11
{
12
    static uint32_t y=2463534242;
13

14
    y ^= y<<13;
15
    y ^= y>>17;
16
    return y ^= (y<<5);
17
}

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