Zufallszahlengenerator
Moderatoren: crack, Krüsty, Marwin
Zufallszahlengenerator
Hallo - ich bin nicht neu in ASM aber habe lange nichts damit gemacht.
Was ASM und die win32Api anbelangt bin ich neu,
Momentan bin ich am überlegen wie ich einen simplen Zufallszahlengenerator realisiere - von (1 - 40h).
als nächstes wüßte ich gern wie ich die z.Bsp mittels einer Dialogbox Werte übergebe.
Wäre nett wenn mir jemand einen Tip bzw. nen ASM code geben kann.
Was ASM und die win32Api anbelangt bin ich neu,
Momentan bin ich am überlegen wie ich einen simplen Zufallszahlengenerator realisiere - von (1 - 40h).
als nächstes wüßte ich gern wie ich die z.Bsp mittels einer Dialogbox Werte übergebe.
Wäre nett wenn mir jemand einen Tip bzw. nen ASM code geben kann.
- crack
- Administrator
- Beiträge: 280
- Registriert: Dienstag 21. Dezember 2004, 15:02
- Wohnort: 53783 Eitorf
- Kontaktdaten:
Hi El Paco 
Uff, eventuell gibt es dafür ne WindowsAPI Funktion, ansonsten denke Ich wäre z.B. eine 'MandelbrotMenge' (bitte selber googlen) oder die Funktionsvorschrift für das Pascalsche Dreieck ne Möglichkeit...
die Methode: GetMessage holt Wert(e) aus der Dialogbox...
Momentan bin ich am überlegen wie ich einen simplen Zufallszahlengenerator realisiere - von (1 - 40h).
Uff, eventuell gibt es dafür ne WindowsAPI Funktion, ansonsten denke Ich wäre z.B. eine 'MandelbrotMenge' (bitte selber googlen) oder die Funktionsvorschrift für das Pascalsche Dreieck ne Möglichkeit...
Die Methode: SendMessage bringt Wert(e) zur Dialogbox und
als nächstes wüßte ich gern wie ich die z.Bsp mittels einer Dialogbox Werte übergebe.
die Methode: GetMessage holt Wert(e) aus der Dialogbox...
mit freundlichen grüssen,
with best regards,
crack
with best regards,
crack
Das mit der Mandelbrotmenge ist ne gute Idee, aber eben sehr aufwendig.
Meine Idee ist folgende:
Man springt an eine Stelle im Speicher und liest dort ein byte ein, das muesste ja sehr zufaellig sein, solange du nicht immer an die selbe Stelle springst.
Aber jetzt frag mich bitte nicht, wie ich das verwirklichen wuerde, weil ich da noch nicht so viel Ahnung hab und ob das ueberhaup funktioniert is ne ganz andre Sache.
Probiers einfach mal.
Meine Idee ist folgende:
Man springt an eine Stelle im Speicher und liest dort ein byte ein, das muesste ja sehr zufaellig sein, solange du nicht immer an die selbe Stelle springst.
Aber jetzt frag mich bitte nicht, wie ich das verwirklichen wuerde, weil ich da noch nicht so viel Ahnung hab und ob das ueberhaup funktioniert is ne ganz andre Sache.
Probiers einfach mal.
würde Windows mit dem Abschuss Deines Programms quitierenDen 'zufälligen' Sprung in den Speicher
angeblich soll das Mersenne Verfahren gut sein, aber ich hab hier auch was nettes gefunden:
Code: Alles auswählen
;Makoto Matsumoto and Takuji Nishimura
;psuedorandom number generating algorithm
;copyright 1997, matumoto@math.keio.ac.jp
;http://www.math.keio.ac.jp/matumoto/emt.html
Rand proto :DWORD ;Generates a number on [0,Max-1]
Randomize proto :DWORD ;Changes the seed for Rand
.const
N equ 624
M equ 397
MATRIX_A equ 9908b0dfh
TEMPERING_MASK_B equ 9d2c5680h
TEMPERING_MASK_C equ 0efc60000h
UM equ 80000000h
LM equ 7fffffffh
.data
mti dd (N+1)
MC dd 69069
.data?
mt dd 2496 dup(?)
.code
Randomize proc Seed:DWORD
lea edi,mt
mov eax,Seed
mov [edi],eax
mov mti,1
@R: add edi,4
mul MC
mov [edi],eax
inc mti
cmp mti,N
jnz @R
ret
Randomize endp
Rand proc Max:DWORD
LOCAL Counter:DWORD
lea edi,mt
.IF mti>=N
.IF mti==N+1
INVOKE Randomize,4357
.ENDIF
mov Counter,0
mov esi,edi
@S: mov eax,[esi]
and eax,UM
mov ebx,[esi+4]
and ebx,LM
or eax,ebx
mov ecx,eax
shr eax,1
mov edx,esi
add edx,(M*4)
mov ebx,[edx]
xor eax,ebx
and ecx,1
.IF ecx
xor eax,MATRIX_A
.ENDIF
mov [esi],eax
add esi,4
inc Counter
cmp Counter,(N-M)
jnz @S
@T: mov eax,[esi]
and eax,UM
mov ebx,[esi+4]
and ebx,LM
or eax,ebx
mov ecx,eax
shr eax,1
mov edx,esi
add edx,((M-N)*4)
mov ebx,[edx]
xor eax,ebx
and ecx,1
.IF ecx
xor eax,MATRIX_A
.ENDIF
mov [esi],eax
add esi,4
inc Counter
cmp Counter,(N-1)
jnz @T
mov edx,edi
add edx,(M-1)*4
mov ebx,[edx]
xor eax,ebx
and ecx,1
.IF ecx
xor eax,MATRIX_A
.ENDIF
mov [esi],eax
mov mti,0
.ENDIF
mov esi,edi
mov eax,mti
inc mti
shl eax,2
add esi,eax
mov eax,[esi]
mov ebx,eax
shr eax,11
xor ebx,eax
mov eax,ebx
shl eax,7
and eax,TEMPERING_MASK_B
xor ebx,eax
mov eax,ebx
shl eax,15
and eax,TEMPERING_MASK_C
xor ebx,eax
mov eax,ebx
shr eax,18
xor eax,ebx
xor edx,edx
div Max
mov eax,edx
ret
Rand endp
http://www.mathe.tu-freiberg.de/inst/st ... or_L/c.htm
viel spass damit
- crack
- Administrator
- Beiträge: 280
- Registriert: Dienstag 21. Dezember 2004, 15:02
- Wohnort: 53783 Eitorf
- Kontaktdaten:
... Ja, Nee, is schon klar...Zitat:
Den 'zufälligen' Sprung in den Speicher
würde Windows mit dem Abschuss Deines Programms quitieren
Selbstverständlich nur nach dem Zuweisen globaler 'Leseberechtigung',
aber grundsätzlich hast Du Recht, die eleganteste Methode ist über eine entsprechende Formel oder mithilfe eines Algorythmus die Zufallszahlen zu 'errechnen', der gute alte C64 hat Zufallszahlen 'gewonnen' indem man das weisse Rauschen des Soundchip digitalisiert hat...
mit freundlichen grüssen,
with best regards,
crack
with best regards,
crack
Stimmt, dass Windows mein Programm beenden würde, wenn ich einfach so im Speicher rum rühre. Wäre sowieso nicht die eleganteste Lösung gewesen. Das mit dem Soundchip find ich genial, sowas ähnliches kann man mit einem 4006 (CMOS-Schieberregister) und einem 4077 (CMOS-XOR-Gatter) basteln und dann wegen mir mit dem Druckerport verbinden, aber ich denke, dass der Aufwand zu groß ist, wenn man erst noch Hardware baut.
- crack
- Administrator
- Beiträge: 280
- Registriert: Dienstag 21. Dezember 2004, 15:02
- Wohnort: 53783 Eitorf
- Kontaktdaten:
Hm, Ich finde eine einfache Hardwarelösung ist oft der rein programmierten Lösung überlegen, denn eine Hardware so wie Du sie beschreibst nimmt dem Computer ja keine Ressourcen weg, und was den Aufwand betrifft: Wirtschaftlich betrachtet ist die Elektroniker Arbeitsstunde idR wesentlich billiger als die Programmierer Arbeitsstunde.Stimmt, dass Windows mein Programm beenden würde, wenn ich einfach so im Speicher rum rühre. Wäre sowieso nicht die eleganteste Lösung gewesen. Das mit dem Soundchip find ich genial, sowas ähnliches kann man mit einem 4006 (CMOS-Schieberregister) und einem 4077 (CMOS-XOR-Gatter) basteln und dann wegen mir mit dem Druckerport verbinden, aber ich denke, dass der Aufwand zu groß ist, wenn man erst noch Hardware baut.
mit freundlichen grüssen,
with best regards,
crack
with best regards,
crack