[Tiptoi] Pseudo Zufallsgenerator

Jürg Wullschleger wullschleger at gmail.com
Mo Sep 17 16:46:01 CEST 2018


Nein, bitte nicht, dadurch bekommst du einen ziemlich schlechten Wuerfel,
besonders falls du schnell hintereinander wuerfelst.

Falls du das +1 nicht weglassen kannst, kannst du doch auch einfach die
linie in zwei
zeilen teilen, z.b. (ich hoffe das stimmt, ich hab schon lange nichts mehr
in dieser sprache geschrieben):

# Wuerfeln, 1. Teil: Zufallszahl von 1-6 in $wuerfel erzeugen.
12345:
- T($r,65536) $rnd+=$r $rnd*=25173 $rnd+=13849 $wuerfel:=$rnd $wuerfel%=6
$wuerfel+=1 J(12346)

# Wuerfeln, 2. Teil: Wuerfelgeraeusch ausgeben, nach ... springen.
12346:
- P(...) J(...)

Juerg

PS: Noch ein Kommentar fuer alle, die bis jetzt T($r,65535) anstatt
T($r,65536) verwendet haben: keine Sorge, der Unterschied ist so winkzig
dass man ihn nie bemerken wird. Ihr braucht also nun nicht alle Spiele
umzuschreiben wegen dem.

On Mon, Sep 17, 2018 at 2:06 PM Marcel Eilers <marcel.eilers at t-online.de>
wrote:

> Hallo Jürg und Christoph,
>
>
>
> vielen Dank für Eure Erklärungen. Damit bin ich nun wieder etwas schlauer.
>
> Ich werde dann zukünftig folgende Generator verwenden:
>
>
>
> - T($r,65536) $wuerfel+=$r $wuerfel*=25173 $wuerfel+=13849 $wuerfel%=6
> $wuerfel+=1
>
>
>
> Somit spare ich wenigstens noch einen Befehl und komme dann mit J() und
> P() auf 8 Befehle. Das reicht für meine Programmierung.
>
>
>
> Vielen Dank Euch.
>
> Gruß
>
> Marcel
>
>
>
>
>
> *Von:* tiptoi [mailto:tiptoi-bounces at lists.nomeata.de] *Im Auftrag von *Christoph
> Weber
> *Gesendet:* Montag, 17. September 2018 08:47
> *An:* tiptoi at lists.nomeata.de
> *Betreff:* Re: [Tiptoi] Pseudo Zufallsgenerator
>
>
>
> 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
>
>
>
>
>
>
>
>
>
>
> --
> tiptoi mailing list
> tiptoi at lists.nomeata.de
> https://lists.nomeata.de/mailman/listinfo/tiptoi
>
-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <https://lists.nomeata.de/pipermail/tiptoi/attachments/20180917/8b355fdc/attachment.htm>


Mehr Informationen über die Mailingliste tiptoi