Zufallszahl



  • Guten Abend,

    ich beschäftige mich zur Zeit mit der VGA Karte und deren Programmierung im Modus 12.

    Das Zeichnen der Punkte funktioniert schonmal ganz gut. Nun möchte ich zufäll irgendwo auf dem Schirm Punkte zeichnen, was er auch bis zu einer gewissen Anzahl macht. Nach ca. 100 Durchgängen scheint er wohl wieder von vorn anzufangen und es werden nicht mehr Punkte.

    Hier mal mein Code dafür:
    Im Datenteil:

    zahl1 dd 11d
    zahl2 dd 8711d
    zahl3 dd 9111d
    

    Im Codeteil:

    zufallszahl proc
    
    	mov eax, zahl1
    	mov ebx, zahl2
    	mul ebx
    	mov zahl2, eax
    
    	mov eax, zahl1
    	mov ebx, zahl3
    	mul ebx
    	mov zahl3, eax
    
    ret
    zufallszahl endp
    

    Zahl1 wird mit zahl2 multipliziert und das Ergebnis zurück nach Zahl2 geschrieben. Genauso mit zahl3.
    Bevor ich den Punkt setze, hole ich mir über die AND Verknüpfung nur die letzten 9 Bit von zahl2 und die letzten 8 Bit von Zahl3.

    Gibt es für Zufallszahlen noch eine effektivere Lösung oder habe ich keine guten Ausgangswerte dafür?

    Gruß



  • Neuere CPUs sollen den neunen Befehl rdrand unterstützen, habe ich neulich in der aktuellen "Instruction Set Reference" von Intel gesehen. Vielleicht hast Du so eine CPU und kannst Dir die Mühe sparen.
    Ansonsten ist das Thema recht komplex. In der c't 2009 Heft 2 gab es mal einen schönen Artikel über Zufallszahlen-Generatoren. Wichtig ist, dass man seinen Generator testet und es gibt viele statistische Tests, um die Zahlenfolge auf Zufälligkeit zu testen. Wer mag schon Statistik...



  • Der Weg von mir war schon ganz gut. Habe das Programm mehrmals nacheinander in Virtual PC gestartet und dann lief es.

    Ich habe noch eine kleine Frage:

    Der Bildspeicher wird mehrmals pro Sekunde von der GraKa ausgelesen.
    Schreibe ich ein Byte in den Speicher ab 0A00h:0000h überträge die Karte es in alle 4 Latch Register und somit in die Bitplanes des Grafikspeichers.

    Wenn ich nun ein Byte aus dem Speicher lese schreibt er auch alle 4 Byte aus den Bitplanes in die Latchregister... aber woher weiß die GraKa welches Byte ich gelesen habe?

    Gruß



  • supernicky2 schrieb:

    Habe das Programm mehrmals nacheinander in Virtual PC gestartet und dann lief es.

    dann ist ja alles gut 🙂



  • supernicky2 schrieb:

    Der Weg von mir war schon ganz gut. Habe das Programm mehrmals nacheinander in Virtual PC gestartet und dann lief es.

    Ich habe noch eine kleine Frage:

    Der Bildspeicher wird mehrmals pro Sekunde von der GraKa ausgelesen.
    Schreibe ich ein Byte in den Speicher ab 0A00h:0000h überträge die Karte es in alle 4 Latch Register und somit in die Bitplanes des Grafikspeichers.

    Wenn ich nun ein Byte aus dem Speicher lese schreibt er auch alle 4 Byte aus den Bitplanes in die Latchregister... aber woher weiß die GraKa welches Byte ich gelesen habe?

    Gruß

    Der Speicherbereich von A0000 bis B0000 ist gemappt. Dh. wenn du darauf schreibst oder liest berührst du nicht den "normalen" Arbeitsspeicher sondern machst so etwas wie beim schreiben/lesen von Ports. Daher bekommt die Hardware auch etwas vom diesem Leseprozess mit bzw. die füttert den Prozessor dann mit Bits und nicht der normale Arbeitsspeicher.



  • abc.w schrieb:

    Neuere CPUs sollen den neunen Befehl rdrand unterstützen...

    Kurze Anmerkung: Die neueren CPUs werden den Befehl rdrand unterstützen. Siehe http://en.wikipedia.org/wiki/RdRand



  • Wenn ich Zufallszahlen brauche benutze ich Uhrzeit und Datum als Basis.
    Eine Userabfrage vorher nacht das ganze noch zufälliger.



  • gargyle schrieb:

    Wenn ich Zufallszahlen brauche benutze ich Uhrzeit und Datum als Basis.
    Eine Userabfrage vorher nacht das ganze noch zufälliger.

    Mit Datum hast du aber einen ziemlich langsamen bzw. statischen "Algorithmus".

    @supernicky
    http://www.df.lth.se/~john_e/gems/gem0002.html

    Oder man könnte sich zum Auslesen auch eine Daten"rutsche" für seinen Zweck machen( z.B. http://www.linux-magazin.de/Heft-Abo/Ausgaben/2001/08/Viel-hilft-viel) machen, oder für jede Zahlenziffer je zwei unterschiedliche Algos bereitstellen, die unterschiedlich angeflogen werden (hm, aber effektiv??).
    Für "effektivere" Algos sind aber auch vor allem größere Zahlen (64bit,FPU,SSE) sinnvoll und/oder eben klassische Anzätze und Algos
    ( z.B. http://en.wikipedia.org/wiki/Xorshift )
    (und statt Multiplikationen eher Additionen und Shifts und so weiter)

    Es ist aber auch keine Schande, einen guten Algo aus irgendeiner Bibliothek zu importieren.
    Und der Witz ist eigentlich das Austesten, und von Zeit zu Zeit "optimieren".



  • Bei mir hat die Verwendung von Uhrzeit/Datum (+Usereingabe) immer hervoragende Ergebnisse gebracht.

    In der Regel brauche ich das ja nur zur Initialisierung (srand)



  • gargyle schrieb:

    Bei mir hat die Verwendung von Uhrzeit/Datum (+Usereingabe) immer hervoragende Ergebnisse gebracht.

    In der Regel brauche ich das ja nur zur Initialisierung (srand)

    Ja, aber dann fragt man sich, ob normale Zahlen wie 123456789 nicht genausogut sind, und die allein sind ja noch kein Zufallszahlengenerator.



  • Dir ist schon klar das sich die Uhrzeit ständig ändert ?



  • gargyle schrieb:

    Dir ist schon klar das sich die Uhrzeit ständig ändert ?

    Und ist dir eigentlich klar, was mit Gigaflops oder Teraflops gemeint sein könnte, wenn die Rechenleistung von Computern oder Prozessoren benannt wird?


Anmelden zum Antworten