Forum: Mikrocontroller und Digitale Elektronik Pseudzufallszahlen LPC 1768


von Christian Walker (Gast)


Lesenswert?

Hallo,

ich bin ein ziemlicher Anfänger in der Mikrokontrollerprogrammierung und 
mich würde mal interessieren, wie ich auf einem Mikrocontroller wie dem 
LPC 1768 Pseudozufallszahlen in C generieren kann. Es gibt hier zwar 
einen Artikel, aber da wird nur auf richtige Zufallszahlen eingegangen, 
die brauche ich aber nicht. Also mein Beispiel sollte relativ einfach 
sein.

Liebe Grüße

Christian

von Michael R. (mexman) Benutzerseite


Lesenswert?

Hallo,

> ich bin ein ziemlicher Anfänger in der Mikrokontrollerprogrammierung und
> mich würde mal interessieren, wie ich auf einem Mikrocontroller wie dem
> LPC 1768 Pseudozufallszahlen in C generieren kann. Es gibt hier zwar
> einen Artikel, aber da wird nur auf richtige Zufallszahlen eingegangen,
> die brauche ich aber nicht. Also mein Beispiel sollte relativ einfach
> sein.

8 Bit:

;*********************************************************************** 
***
;                   Zufallszahlen (RANDOM = 1...FE)
;*********************************************************************** 
***
           ;RANDOM <> 0 zum Start
        RLF     RANDOM, W       ;
        RLF     RANDOM, W       ;
        BTFSC   RANDOM, 3       ;
        XORLW   1               ;
        BTFSC   RANDOM, 4       ;
        XORLW   1               ;
        BTFSC   RANDOM, 5       ;
        XORLW   1               ;
        MOVWF   RANDOM          ;
;*********************************************************************** 
***

von Michael R. (mexman) Benutzerseite


Lesenswert?

Die ASM Befehle musst Du fuer Deinen uC wohl anpassen.


Gruss

Michael

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

Wenns in C sein soll, wie wäre es mit rand() aus der stdlib?

mfg

von heinz (Gast)


Lesenswert?

Goggle mal nach Linear rückgekoppeltes Schieberegister (lfsr)

von Christian (Gast)


Lesenswert?

** Lötlackl schrieb:
> Wenns in C sein soll, wie wäre es mit rand() aus der stdlib?
>
> mfg

Kann man denn die rand() Funktion einfach so auf einem Mikrocontroller 
verwenden?

Linear rückgekoppeltes Schieberegister werde ich mir mal anschauen, 
danke dafür.

von Lötlackl *. (pappnase) Benutzerseite


Angehängte Dateien:

Lesenswert?

Christian schrieb:
> Kann man denn die rand() Funktion einfach so auf einem Mikrocontroller
> verwenden?

Ich hatte das schon mal gemacht. Bin dann über was anderes gestolpert, 
kam sogar hier irgendwo aus dem Forum, glaube ich. Siehe Anhang

mfg

von Michael F. (startrekmichi)


Lesenswert?

Was auch sehr gut und einfach funktioniert ist der hier, den habe ich 
letztens mal auf einen FPGA gepackt:
http://de.wikipedia.org/wiki/Xorshift

Man braucht halt wirklich nur Xor und Shifts. Die Parameter sind etwas 
kritisch, aber für 32 und 64 Bit sind die gültigen glaube ich im 
originalen Paper aufgelistet. Wenn dir 8 oder 16 Bit reichen, gibt's die 
Werte hier:
http://www.arklyffe.com/main/2010/08/29/xorshift-pseudorandom-number-generator/

von Christian (Gast)


Lesenswert?

Michael Frangenberg schrieb:
> Was auch sehr gut und einfach funktioniert ist der hier, den habe ichletztens 
mal auf einen FPGA gepackt:http://de.wikipedia.org/wiki/XorshiftMan braucht halt 
wirklich nur Xor und Shifts. Die Parameter sind etwaskritisch, aber für 32 und 64 
Bit sind die gültigen glaube ich imoriginalen Paper aufgelistet. Wenn dir 8 oder 
16 Bit reichen, gibt's dieWerte 
hier:http://www.arklyffe.com/main/2010/08/29/xorshift-p...

Das ist ein wirklich guter Link. Vielen Dank dafür.

Die einzige Möglichkeit, die mir eingefallen ist, um Zufallszahlen 
zwischen 30 und 120 zu erzeugen:
1
uint8_t xorshift8() 
2
{
3
    y8 ^= (y8 << 7);
4
    y8 ^= (y8 >> 5);
5
    return y8 ^= (y8 << 3);
6
}
7
8
uint8_t GetRandomNumberBetween30And120()
9
{
10
  uint8_t value;
11
  do
12
  {
13
    value=xorshift8();
14
  }while(value<30||value>120);
15
  return value;
16
}

Zwar ziemlich dämlich, aber es funktioniert erstmal.

von sebastian (Gast)


Lesenswert?

Hi,
würde das hier auch funktionieren?

uint8_t GetRandomNumberBetween30And120()
{

  return (uint8_t)((uint16_t)xorshift8()*6/17)+30;
}

gruß
Seb

von Michael F. (startrekmichi)


Lesenswert?

sebastian schrieb:
> Hi,
> würde das hier auch funktionieren?
>
> uint8_t GetRandomNumberBetween30And120()
> {
>
>   return (uint8_t)((uint16_t)xorshift8()*6/17)+30;
> }

Allgemein muss man dran denken, dass der Xorshift keine 0 erzeugen kann, 
dann wäre nämlich nichts mehr zum shiften da. Das ist auch der Grund, 
warum es nur wenige korrekte Parameter gibt. In diesem Fall würde es 
sogar noch funktionierten, aber nur wegen der Integerdivision. Und man 
sollte sicherheitshalber folgendes schreiben (6/17==0):
return (uint8_t)(  ((uint16_t)xorshift8()*6) /17) +30;

Was für Anforderungen hast du denn an die Zufallszahlen? Diese Rechnung 
wird dir durch die Quantisierung (nur ganze Zahlen) nämlich die 
Verteilung der Zahlen verschlechtern, sprich es wird keine saubere 
Gleichverteilung mehr sein. Unter dem Gesichtspunkt ist die "dämliche" 
Lösung besser, die liefert nämlich weiterhin eine Gleichverteilung.

mfg
 Michael

von sebastian (Gast)


Lesenswert?

Michael Frangenberg schrieb:
> In diesem Fall würde es
> sogar noch funktionierten, aber nur wegen der Integerdivision. Und man
> sollte sicherheitshalber folgendes schreiben (6/17==0):
> return (uint8_t)(  ((uint16_t)xorshift8()*6) /17) +30;

Ja, nach ANSI haben zwar * und / die selbe Prio und deshalb sollte dann 
von links nach rechts berechnet werden, aber sicherer ist mit der 
Klammer.

> Was für Anforderungen hast du denn an die Zufallszahlen?

Ich, keine. Habe nur beim ansehen des Beispiels überlegt, wie man die 
lösung mit der Schleife in eine Berechnung umsetzten kann.
Bei der Schleifen Lösung kann e ja zu einem ziemlichen "pumpen" in der 
Laufzeit kommen?

> Diese Rechnung
> wird dir durch die Quantisierung (nur ganze Zahlen) nämlich die
> Verteilung der Zahlen verschlechtern, sprich es wird keine saubere
> Gleichverteilung mehr sein. Unter dem Gesichtspunkt ist die "dämliche"
> Lösung besser, die liefert nämlich weiterhin eine Gleichverteilung.

Ja, das habe ich mir berits gedacht. Aber in Stochastik habe ich immer 
geschlafen ;-)

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.