Zufallszahlengenerator

Hier könnt ihr sowohl zur x86 Architektur als auch zu Win32ASM Fragen stellen.

Moderatoren: crack, Krüsty, Marwin

Zufallszahlengenerator

Beitragvon El_Paco » Freitag 29. April 2005, 13:48

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.
El_Paco
Newbie
 
Beiträge: 1
Registriert: Mittwoch 27. April 2005, 18:23

Beitragvon crack » Freitag 29. April 2005, 15:33

Hi El Paco :D

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...


als nächstes wüßte ich gern wie ich die z.Bsp mittels einer Dialogbox Werte übergebe.


Die Methode: SendMessage bringt Wert(e) zur Dialogbox und
die Methode: GetMessage holt Wert(e) aus der Dialogbox...
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Beitragvon Tim » Freitag 20. Mai 2005, 10:20

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.
Tim
Newbie
 
Beiträge: 7
Registriert: Mittwoch 6. April 2005, 19:22

Beitragvon crack » Freitag 20. Mai 2005, 10:28

Den 'zufälligen' Sprung in den Speicher könntest Du realisieren indem Du die SystemTime bzw. TimerTick since SystemStart als Pointer benutzt... :wink:
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Beitragvon CDW » Freitag 20. Mai 2005, 23:23

Den 'zufälligen' Sprung in den Speicher

würde Windows mit dem Abschuss Deines Programms quitieren ;)
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

man kann zwar ein paar shifts machen mit der Systemzeit, aber IMHO so halbwegs gute Verfahren müssten mathematisch begründet sein.
http://www.mathe.tu-freiberg.de/inst/st ... or_L/c.htm
viel spass damit ;)
CDW
Alter Hase
 
Beiträge: 62
Registriert: Donnerstag 2. Oktober 2003, 17:17

Beitragvon crack » Samstag 21. Mai 2005, 12:44

Zitat:
Den 'zufälligen' Sprung in den Speicher

würde Windows mit dem Abschuss Deines Programms quitieren


... Ja, Nee, is schon klar...

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
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Beitragvon Tim » Montag 23. Mai 2005, 09:53

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.
Tim
Newbie
 
Beiträge: 7
Registriert: Mittwoch 6. April 2005, 19:22

Beitragvon crack » Montag 23. Mai 2005, 11:02

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.


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.
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf


Zurück zu Assembler

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron