Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
24.08.2001, 17:42
WareWolf



Kleines Problem:
Zufallszahlen in Assembler, so mach ich es bisher:
Quellcode:
        mov ax,0
        mov es,ax
        mov es:al,[046c]        ;Zeit
        mov ah,[ZZahl]          ;Zufallszahl alt
        add al,ah
        mov [ZZahl],al          ;neue ZF Zahl

ich nehm also den hundertstelsek Timer aus 0000:046c und addiere immer die "alte" Zufallszahl hinzu. Das funktioniert auch so einigermassen. Aber wie Ihr Euch denken könnt, bei einer kontinuierlichen Abfrage in Schleifen etc. entstehen nach und nach die gleichen Zahlenmuster, also nix mit Zufall.

Dann hab ich auch schon das Register für die Rasterzeile der VGA Karte auf ähnliche Weise benutzt, aber das ist genau so "gleichmässig".

Nun meine Frage:
Die Hochsprachen C..ect. haben doch Randomwerte integriert, wie werden die eigentlich intern erzeugt ??
Die ideale Zufallszahl würde durch "weisses Rauschen" erzeugt, nur ist dies m.E. im PC oder den Betriebssystemen gar nicht enthalten, oder irre ich mich da ??

--

Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴
WW

zum Seitenanfang zum Seitenende Profil || Suche
001
24.08.2001, 18:16
Prefect



Das hier ist der Diablo2-Zufallsgenerator (nicht (c) darthpaul ;)).

18:34:42 <darthpaul> struct RAND
18:34:42 <darthpaul> {
18:34:42 <darthpaul> DWORD Seed;
18:34:42 <darthpaul> DWORD Carry;
18:34:42 <darthpaul> };
18:34:44 <darthpaul> inline DWORD Random(RAND *rnd)
18:34:46 <darthpaul> {
18:34:49 <darthpaul> DWORDLONG x = rnd->Seed;
18:34:50 <darthpaul> x *= 0x6ac690c5;
18:34:52 <darthpaul> x += rnd->Carry;
18:34:54 <darthpaul> rnd->Seed = DWORD(x);
18:34:56 <darthpaul> rnd->Carry = WORD(x >> 32);
18:34:58 <darthpaul> return rnd->Seed;
18:35:00 <darthpaul> }

Viel Spaß damit. Das Ganze kann man locker in Assembler übertragen. (shld ist ne nette Anweisung)
Ansonsten könntest du dir auch mal diverse RTLs anschauen. glibc sowieso, aber bei MSVC++ ist auch die RTL mit Quellcode dabei...

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
002
27.08.2001, 18:58
WareWolf



Danke jedenfalls für die Antwort, bringt mir aber ehrlich gesagt nichts.
x *= 0x6ac690c5;
ist das ein Verweis auf eine Speicherstelle ?
(hab keinen Plan von C)

--

Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴
WW

zum Seitenanfang zum Seitenende Profil || Suche
003
28.08.2001, 00:34
Kriz



Es gibt eigentlich keine echten Zufallszahlen in Computern, schon aus der Tatsache heraus, daß eine (umgangsprachliche) ZUFALLSZAHL eine beliebige Zahl darstellt und das Zahlenspektrum ist in einem Computer begrenzt. Zwar weniger von der Darstellungsgröße von irgendwelchen Datentypen, sondern durch die Speicherressourcen.

Eine Folge von Zufallszahlen zu erschaffen, unterliegt folgenden Algorithmen:

a) Die Methode der linearen Kongruenz (Lehmer'sche Restmethode)
b) Die Methode der additiven Kongruenz
c) Der Mix aus a) und b)

--------------------------------------------------------------------------

zu a)

Der C/C++ Code ist simpel. Erstellt wird ein Array mit N Zufallszahlen nach der Lehmer'schen Restmethode, wobei seed, b und m Konstanten sind, die man vorher festlegen muß. Das Ergebnis ist eine Folge von Zufallszahlen zwischen 0 und m-1:

Quellcode:a[0] = seed;
for( i=1; i<=N; i++) a[ i ] = ( a[i-1] * b+1) % 8;

Das Problem ist nur die geschickte Wahl der Konstanten! Eine Wahl wie seed = 0, b = 19 und m = 381 führt zu der sich schnell wiederholenden Folge:

0, 1, 20, 0, 1, 20, ...

Und das in einem Zufallsspektrum zwischen 0 und 380. Nicht sehr erhabend... Dieser Algorithmus erzeugt u.U. einen Überlauf!!!. Es gibt aber eine Methode, den Überlauf zu verhindern. Aber den Code möchte ich jetzt hier nicht reinpacken... Bei Bedarf jo, aber nicht jetzt =)

zu b)

Die zweite Methode beruht auf den Schieberegistern mit linearer Rückführung und basiert auf Berechnungen in der Bitebene. Der Code basiert u.a. auf dem Überlaufschutz-Code, also daher erst später...

Da der Algorithmus b) auf Hardwareebene gut realisiert werden kann, ist er meist derjenige, der für Zufallszahlenerzeugung benutzt wird. Die Konstanten werden als beliebige Zahl gemäß dem Systemtakt vom System zum zeitpunkt des Aufrufs automatisch festgelegt.

Cu
(schnarch)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 28.08.2001 um 00:35 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
28.08.2001, 12:29
WareWolf



ja, gut.
Dann bin ich aber mit meiner Methode, den zufälligen Wert des schnellen Timers mit Konstanten oder sich selbst (oder geshiftet) zu verwursteln, auch ganz gut im Rennen. Dann gibt es also nicht viel besseres, denn jede Arithmetik mit Konstanten führt bei zyklischen Aufrufen irgendwann zu Wiederholungen.

Ich hatte eigentlich deshalb den Thread eröffnet, weil ich aus der früheren C64 Zeit noch weiss, daß dort die Zufallszahlen aus dem Soundchip (SID) ausgelesen wurden. Dieser erzeugte auf Hardwarebasis ein weisses Rauschen ähnlich der Chaos-Theorie. Das waren dann wirkliche Zufallszahlen.

Na ja, es ist nicht immer alles besser geworden...

DANKE

--

Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴
WW

zum Seitenanfang zum Seitenende Profil || Suche
005
28.08.2001, 17:32
apfelkorn



Es ist niemals möglich, einem Computer eine "echte" Zufallszahl abzuverlangen, ausser, sie wird durch äussere Einflüsse beeinflußt. (Also z.B. durch ein angeschlossenes Mikrofon, oder durch eine getragene Kamera, die auch ständig neues sieht, u.ä.

--

zum Seitenanfang zum Seitenende Profil || Suche
006
28.08.2001, 20:08
Prefect



Unter Linux gibt's ja /dev/random, das Gerät liefert die Zufallszahlen, die aus gewissen Hardwareinputs gewonnen werden.. z.B. Netzwerkpakete, Aktivitäten an der Tastatur und am seriellen Port.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
007
29.08.2001, 10:59
apfelkorn



Seht ihr... :)

--

zum Seitenanfang zum Seitenende Profil || Suche