Forum: Mikrocontroller und Digitale Elektronik Quellcode für Pseudozufallsgenerator


von Hardy Flor (Gast)


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

von Michael U. (amiga)


Angehängte Dateien:

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

von Jörg F. (jopelabln)


Angehängte Dateien:

Lesenswert?

Hier noch etwas in C. Ist auch aus diesem Forum

von Hardy Flor (Gast)


Lesenswert?

Danke an beide, damit komme ich schon viel weiter.

Das erste Projekt ist nur für eine Eisenbahn das Licht der Häuser zu 
steuern.

Hardy

von Artur Funk (Gast)


Lesenswert?

Was spricht dagegen eine einfache rand Funktion zu benutzen?

von 6636 (Gast)


Lesenswert?

Resourcen ? Rand ist etwas heftig. Ein LFSR ist anspruchsloser.

von Fred S. (Gast)


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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

von Ulrich B. (ulrich_b18)


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
}

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.