PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pseudozufallsgenerator ? (gelöst)



PICture
09.11.2010, 19:35
Hallo!

Ich möchte, dass mein künstliches Tier (k.T) bei einem Hindernis sich um quasi zufälligen Winkel dreht und danach geradeaus fährt. Die Suche in unserem Forum hat mir leider keine Antwort gebracht. Für mich ist es mit simple Hardware kein Problem, möchte es aber, wenn möglich, rein softwaremässig in ASM lösen. Es reichen 4-bittige Hexzahlen aus. Ist es mit kürzerem als 16-bittigen Register mit Schiebung/Rotierung um 1 Bit möglich ? Vielleicht mit Carry-Flag in 8-bittigem Register und anschlessender Rotierung ?

Ich habe das im Netz gefunden, aber weiß ich leider nicht, was CRC ist. :(



Hier ist einfach Hack, den ich vor einigen Jahren eingesetzt. Ich arbeitete in Embedded und ich musste RAM auf Power-up-Test, und ich wollte wirklich klein, schnell Code und sehr wenig Staat, und ich habe dazu:

* Beginnen Sie mit einem beliebigen 4-Byte-Konstante für deinen Samen.

* Berechnen Sie die 32-Bit-CRC dieser 4 Byte. Das gibt Ihnen die nächsten 4 Bytes

* Feed back diese 4 Bytes in den CRC32-Algorithmus, als wären sie angehängt. Die CRC32 dieser 8 Bytes wird der nächste Wert.

* Wiederholen Sie, solange Sie wollen.

Ich bin für jeden praktischen Hinweis sehr dankbar, weil Programmierung nur mein Hobby ist. :)

MfG

Besserwessi
09.11.2010, 21:58
Die Lösung für Faule ist die random() Funktion aus libc.

Eine andere Lösung ist das nachprogrammieren eines Schieberegisters mit Rückkopplungen via XOR. Mit nur 8 Bit wird das aber nicht besonders gut, weil man da halt nur maximal 255 verschiedenen Zustände bekommt. Das ist eine noch sehr überschaubare Zufallsfolge.

Bei der Programmierung kann man aber auch längere Schieberegister (z.B. 32 Bits) machen, wie angedeutet über das Carry flag und dann den Befehlen die beim Verschieben das Carry-Flag mit nutzen (z.B. ROL beim AVR ).


edit:
Noch ein Link dazu:
http://de.wikipedia.org/wiki/Linear_rückgekoppeltes_Schieberegister

PICture
09.11.2010, 22:19
Hallo Besserwessi!

Vielen Dank für deine, für mich retende, Antwort ! :)

Ich bin, glaube ich, nicht faul, habe aber leider keine Liebrary's in ASM für PIC's und werde das gerne selber programmieren. Das mit Schieberegister und XOR kann ich mir noch als Hardwarelösung erinnern, softwaremässig realisieren und 255 Richtungen brauche ich sicher nicht. ;)

Das mit Carry-Flag ist nur meine "verrückte" Idee, die mir spontan eingefallen ist. Wenn es jedoch Sinn machen würde, werde ich noch darüber ernst nachdenken, weil ich für mein Spielzeug nichts "professionelles" brauche.

Besonders bin ich dir für den Link dankbar, den ich eigentlich selber finden sollte. Dann bin ich doch faul ... :(

MfG

TobiKa
10.11.2010, 11:10
Ein unbeschalteter Adc Pin ist auch immer gut zum erstellen von zufälligen Werten.

PICture
10.11.2010, 14:26
Hallo TobiKa!

Schönen dank für deine tolle Idee, die ich sicher verwende, falls ich mich für PIC mit ADC entscheide. :)

Vielleicht mit einem genug langem Stück Draht am Eingang des ADC's eventuell noch beim störenden Antriebsmotor, wird es noch besser "funktionieren", weil der Eingangswiderstand bei PIC's nur um 10 k ist. Es wäre zwar eine Hardware, aber einfachste Lösung.

In jedem Fall werde ich versuchen den ADC maximal zu stören, was nicht normal ist, oder ? :)

MfG

Netzman
10.11.2010, 14:36
Hallo,

es reicht ein beliebiger als Input definierter Pin (unbeschaltet, ohne Pullup), bei dem man Bit für Bit seine Zufallszahl einliest. Das könnte man das als Seed für den Pseudogenerator nehmen und erhält immer unterschiedliche Zahlenfolgen.

mfg

PICture
10.11.2010, 14:58
Hallo Netzman!

Super Idee, herzlichen Dank! :)

Es ist noch einfachere Idee, falls ich doch einen PIC ohne ADC für mein Spielzeug nehme. Eine "Antenne" am Pin könnte das evtl noch verbessern ...

Das es noch einfacher geht, bezweifle ich schon langsam ... ;)

MfG

TobiKa
10.11.2010, 15:23
Musst nur aufpassen das du bei starken Störungen + einer Antenne nicht immer ein High bekommst.

Aber wie auch immer, wenn du es getestet hast, berichte mal bitte!

PICture
10.11.2010, 15:49
Natürlich, gerne, aber erst wenn ich so weit bin, weil momentan baue ich den Fargestell ... :(

Also bis irgendwann! :)

MfG

Besserwessi
10.11.2010, 17:23
Nur ein ADC mit "Antenne" ist kein guter Zufallsgenerator. Dabei kommen dann oft 50 Hz oder ähnliches bei raus. Selbst wenn man nur dsa untere Bit des ADs nimmt, hat man damit z.B.: nicht gesichert das man 50% H und L hat. Man sollte den echten Zufall dann noch einmal mit einer Pseudozufallszahl verknüpfen. So kann man z.B: leicht sicher stellen das die Verteilung so ist wie man es erwartet und von externen Einflüssen unabhängig.

TobiKa
10.11.2010, 17:41
@Besserwessi
Was hat ein ADC mit High und Low bzw. 50Hz zu tun?!

radbruch
10.11.2010, 18:04
Hallo

Hier ein Beispiel für das Berechnen von Zufall in C:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=292790#292790

Völlig ohne ADC und Netzfrequenzempfängerantenne :)

Gruß

mic

Besserwessi
10.11.2010, 18:58
Einfach ein Draht am ADC Eingang wird wahrscheinlich dazu führen, dass man 50 Hz Störungen drauf hat. Das gibt zwar sich ändernde Werte, aber halt nicht zufällig, sondern vorhersehbar. Das externe 50 Hz Signal taugt relativ wenig als Zufallszahl.

Der erste Schritt um daraus noch wenigstens annähernd was zufälliges zu bekommen, ist es nur das niederwertigste Bit zu betrachten. Damit hat man dann eine binäre Folge.

Für wirklich echte Zufallzahlen sollte der ADC eine echtes Rauschen (z.B. von einer Zenerdiode) bekommen, und man muss einiges an Aufwand treiben, um die 50 Hz nicht dabei zu haben.

ranke
10.11.2010, 19:22
Bei der genannten Anwendung wird die Pseudozufallszahl in eher unregelmäßigen Abständen gebraucht. Daher dürfte es auch zulässig sein, ständig ein Register zu inkrementieren (solange der Prozessor gerade nichts wichtigeres zu tun hat) und den Registerwert bei Bedarf als Pseudozufallszahl zu interpretieren.

PICture
10.11.2010, 19:37
Hallo!

@ radbruch!

Besten Dank für deinen Vorschlag und Link! :)

Ich kenne C gar nicht und für mich ist deshalb eine "Antenne" lieber als eine Zeile Code in C. ;)

@ Besserwessi

Vielen Dank für deine Erklärung, aber wenn ich für mein Spielzeug echte Zufallszahlen streben würde, dann wäre für mich schon ein Termin bei einem Psychiater nötig. ;)

Ich habe mich bereits für einfachste für mich Lösung entschieden (AVR mit BASCOM "RND") und erwarte keine "bessere" Vorschläge mehr. :(

@ ranke

Genau um das geht mir: nicht perfekt, aber einfacher nicht möglich ... :)

MfG