mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Quellcode für Pseudozufallsgenerator


Autor: Hardy Flor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael U. (amiga)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Friedrich (jopelabln)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch etwas in C. Ist auch aus diesem Forum

Autor: Hardy Flor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Artur Funk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was spricht dagegen eine einfache rand Funktion zu benutzen?

Autor: 6636 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Resourcen ? Rand ist etwas heftig. Ein LFSR ist anspruchsloser.

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
.equ RNDM=181    ;
.equ RNDA=359    ;

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

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

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; rnd() returns a random number in lrph, updates rndseed; changes lrpl
; changes r1:r0
; SEED=181*(OLDSEED)+359; random number=high(SEED)
rnd:
  push rw
  push rw_
  lds rw, rndseed    ; seed LSB
  ldi rw_, RNDM    ; multiplicator
  mul rw, rw_    ;
  movw lrph:lrpl,r1:r0; save result
  lds rw, rndseed+1  ; seed MSB
  mul rw, rw_    ;
  add lrph, r0    ; add 
  ldi rw, low(RNDA)
  add lrpl,rw    ; add RNDA
  ldi rw, high(RNDA)  ;
  adc lrph,rw    ;
  sts rndseed, lrpl  ; save 
  sts rndseed+1, lrph  ;
  pop rw_
  pop rw
  ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Autor: Ulrich B. (ulrich_b18)
Datum:

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

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

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.