[Tiptoi] Pseudo Zufallsgenerator

Christoph Weber christoph at oopsi.de
Mo Sep 17 08:47:11 CEST 2018


Hi Marcel,

ich versuch mal eine kurze Erklärung was hier passiert:

T($r, 65535) liest den Timer aus und "begrenzt" ihn über die
modulo-funktion auf 0-65535.

Das register $rnd enthält den aktuellen Zufallszahlen-Seed-Wert; initial
0, nach $rnd+=$r steht darin die maskierte Zeit von eben. Beim nächsten
Durchlauf (also nächster Zufallszahl) wird wieder die aktuelle Zeit
addiert um eine zufälligere Streuung zu erzeugen.

Danach wird der Wert mit 25173 multipliziert -  der Wert ist relativ
willkürlich aber in der Literatur und typischen Implementierungen zu
finden; ebenso der Werte 13849 der aufaddiert wird. Das ganze dient nur
dazu bei jeder Zufallszahl einen neuen seed-Wert zu bekommen aus dem die
eigentliche Zufallszahl berechnet wird.

Man kann für die beiden Konstanten auch andere Werte verwenden, aber bei
ungeeigneten Konstanten ist der Zufall halt schlechter oder gar nicht
mehr vorhanden (z.B. Multipliator 0 oder 1 oder beim offset kleine
Zahlen. Der Multiplikator sollte z.B. auch immer ungerade sein, sonst
kommen (wegen des ungeraden Offsets) nur ungerade Würfelergebnisse raus.


Deine Version würde zwar auch Zufallszahlen erzeugen, aber mit einer
erheblich schlechteren Streuung weil der seed-Wert nur noch von der
aktuellen Zeit abhängt - Extrembeispiel: dreimal in der gleichen Sekunde
würde dreimal der gleiche "Zufallswert"erzeugt. Deshalb auch das dritte
register $r - um es auf $rnd aufzuaddieren.

Die Befehle $wuerfel%=6 und $wuerfel+=1 sind nur dazu da um die
Zufallszahl zuerst auf 0-5 zu begrenzen und dann um 1 zu erhöhen damit
Würfelaugen herauskommen.


Oder als Formel geschrieben:

  $rnd = ($rnd + AktuelleZeitInSekunden modulo 65535) * 25173 + 13849

  $wuerfel= ($rnd modulo 6) + 1



Schöne Grüße

 christoph


Am 17.09.2018 um 07:59 schrieb Marcel Eilers:
>
> Guten Morgen,
>
>  
>
> auf die Notwendigkeit meine Programmierung auf maximal 8 Befehle in
> einer Reihe zu kürzen, habe ich mir den „Pseudo-Zufallsgenerator“
> nochmal angesehen. Irgendwie bin ich da nicht ganz dahinter gestiegen.
> Aber interessieren würde es mich trotzdem.
>
>  
>
> Also der Standard Generator lautet:
>
>  
>
> - T($r,65535) $rnd+=$r $rnd*=25173 $rnd+=13849 $wuerfel:=$rnd
> $wuerfel%=6 $wuerfel+=1
>
>  
>
> Damit habe ich schon 7 Befehle verbraucht. Jetzt noch ein J und ein P
> Befehl und der Assembler macht Probleme.
>
>  
>
> Warum werden für diese Funktion 3 Register verwendet?? Man könnte dies
> auch so schreiben:
>
>  
>
> - T($wuerfel,65535) $wuerfel*=25173 $wuerfel+=13849 $wuerfel%=6
> $wuerfel+=1
>
>  
>
> Dann hätte ich das um 2 Befehle reduziert…
>
>  
>
> Welche Bedeutung haben die Zahlen 25173 und 13849???? Ist das willkürlich?
>
>  
>
> Wäre schön, wenn mir jemand dieser Funktion einfach nur mal erläutern
> könnte. Dies einfach nur interessehalber…
>
>  
>
> Vielen Dank für Eure Bemühungen.
>
>  
>
> Schöne Grüße
>
> Marcel
>
>  
>
>  
>
>  
>
>
>

-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <https://lists.nomeata.de/pipermail/tiptoi/attachments/20180917/574ae5f0/attachment.htm>


Mehr Informationen über die Mailingliste tiptoi