blob: 489214d12b76bd60a7ee6b7c245cdec3c3f59806 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001Es gibt im MG zwei Quellen von Pseudo-Zufallszahlen.
2
31) random()
4 Diese efun liefert eine Zufallszahl aus dem Pseudo-Zufallszahlengenerator
5 (PRNG) des Drivers. (s. Manpage).
6 Wenn keine besonderen Gruenden vorliegen, sollte immer diese verwendet
7 werden.
8
9
102) /std/util/rand-glfsr.c
11 Falls jemand aus irgendeinem Grund eine Sequenz von Pseudo-Zufallszahlen
12 braucht, die spaeter reproduzierbar sein soll (d.h. der Seed muss
13 konfigurierbar sein), gibt es unter /std/util/rand-glfsr.c einen simplen,
14 nicht allzu guten und sehr ineffizienten Pseudo-Zufallszahlengenerator.
15
16Interface:
17* public varargs void init(int seed, int newp)
18 Setzt das Seed (und das Erzeugungspolynom, wenn gewuenscht, wovon ich
19 aber abraten wuerde). Der Seed darf nicht 0 sein.
20* public void InitWithUUID(string uuid)
21 Berechnet einen Seed aus der uuid und initialisiert den PRNG damit (und dem
22 Default-Polynom).
23* public int nextbit()
24 Liefert ein zufaelliges Bit (also 0 oder 1).
25* public int nextbits(int count)
26 Liefert <count> Bits (max 64) in einem int.
27* public int random(int n)
28 Liefert eine Zufallszahl zwischen 0 und n-1, in welcher 32 bits an
29 Pseudozufall stecken.
30 Das Seed von der Blueprint wird vermutlich staendig veraendert (d.h.
31 verlasst euch nicht drauf, dass es konstant bleibt), wollt ihr eine
32 'private' Instanz mit eurem Seed, clont das Objekt (aber verliert den Clone
33 nicht).
34
35 Und um es nochmal zu sagen:
36 Die IMHO einzige sinnvolle Anwendung ist, wenn man aus irgendeinem Grund
37 das seed selber waehlen muss, damit man die Sequenz von Pseudozufall immer
38 wieder reproduzieren kann.
39 In allen anderen Faellen nehmt besser das random() vom Driver.
40
41Der PRNG benutzt ein Linear Feedback Shift Register (in Galois-Variante). Die
42Periodenlaenge des per Default benutzten Erzeugngspolynoms ist 2^32 - 1, d.h.
43nach 4294967295 Bits wiederholt sich die Sequenz.
44Das Default-Polynom ist:
45x^32 + x^31 + x^28 + x^27 + x^24 + x^23 + x^20 + x^19 + x^16 + x^15 + x^12
46 + x^11 + x^8 + x^7 + x^5 + x^3 + 1
47(Zahlenwert: 0x1999999a8)
48
49Wer ein anderes Polynom will, kann das per init() konfigurieren, sollte sich
50aber schlau machen, welche sinnvoll nutzbar sind.
51
52
53Ein paar statistische Daten eines Stroms von 40960 Bits:
54Value Char Occurrences Fraction
55 0 20474 0.499854
56 1 20486 0.500146
57
58Total: 40960 1.000000
59
60Entropy = 1.000000 bits per bit.
61
62Optimum compression would reduce the size
63of this 40960 bit file by 0 percent.
64
65Chi square distribution for 40960 samples is 0.00, and randomly
66would exceed this value 95.27 percent of the times.
67
68Arithmetic mean value of data bits is 0.5001 (0.5 = random).
69Monte Carlo value for Pi is 3.109026964 (error 1.04 percent).
70Serial correlation coefficient is -0.008399 (totally uncorrelated = 0.0).
71