Forum: PC-Programmierung Zufallsgenerator in Win32 Assembler


von agzo (Gast)


Lesenswert?

Hey ihr!

Ich hab da nen Problem einen Zufallsgenerator in Win32 Assembler 
umzusetzen. Dabei geht es mir nicht um kryptografisch sichere 
Zufallszahlen, es reicht mir vollkommen wenn die generierten Zahlen sich 
von Programmstart zu Programmstart unterscheiden. Mein bisheriger Ansatz 
war einfach die GetTickCounts API zu benutzen, aber das Problem ist das 
sich diese "Zufallszahl" nur einmal pro ms ändert, ich aber mehrere 
Zufallszahlen pro ms brauche. Danach habe ich versucht einen "lineareren 
Kongruenzgenerator" 
(http://de.wikipedia.org/wiki/Linearer_Kongruenzgenerator) zu 
implementieren, mit der Rückgabe von GetTickCounts als ersten Seed. Aber 
leider wähle ich entweder die ganze Zeit ungünstige Parameter oder mein 
Code weist irgendwo einen fundamentalen Fehler auf (ich fürchte ich 
runde zu großzügig aber wenn ich das nicht mache kann es vorkommen, dass 
bei der Division die Register zu klein sind und mein Programm abstürzt).
Ich muss dazu sagen, dass es mein erstes Projekt in Win32 Assembler ist, 
davor habe ich Assembler nur für AVRs programmiert.

Als erstes würden mich alle Informationen, wenn möglich Sources 
interessieren die sich damit beschäftigen einen einfachen 
(pseudo-)Zufallsgenerator in ASM umzusetzen. Wenn ihr noch andere 
innovative Ideen entwickelt habt wie ich einen einfachen 
Zufallsgenerator umsetzen könnte sind die natürlich auch gerne 
willkommen ;D

Achja, nur für den Fall, dass ihr euch tatsächlich meinen Quälcode antun 
wollt kann ich den natürlich auch noch posten, aber wie gesagt ist es 
mein erstes Win32 Assembler Projekt also erwartet nicht allzu viel von 
meinem Code, vieles ist halt noch sehr unschön gelöst.

von ist gut so (Gast)


Lesenswert?

Aus den "Numerical Recipes", 7.1, Quick and Dirty Generators - An Even 
Quicker Generator.
Ist zwar in C, jedoch so einfach, dass eine Umsetzung in ASM trivial 
ist.

--------------------------------------------
unsigned long idum;
...
idum = 1664525L*idum + 1013904223L;
-----------------------------------------------

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.