MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 1 | Es gibt im MG zwei Quellen von Pseudo-Zufallszahlen. |
| 2 | |
| 3 | 1) 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 | |
| 10 | 2) /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 | |
| 16 | Interface: |
| 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 | |
| 41 | Der PRNG benutzt ein Linear Feedback Shift Register (in Galois-Variante). Die |
| 42 | Periodenlaenge des per Default benutzten Erzeugngspolynoms ist 2^32 - 1, d.h. |
| 43 | nach 4294967295 Bits wiederholt sich die Sequenz. |
| 44 | Das Default-Polynom ist: |
| 45 | x^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 | |
| 49 | Wer ein anderes Polynom will, kann das per init() konfigurieren, sollte sich |
| 50 | aber schlau machen, welche sinnvoll nutzbar sind. |
| 51 | |
| 52 | |
| 53 | Ein paar statistische Daten eines Stroms von 40960 Bits: |
| 54 | Value Char Occurrences Fraction |
| 55 | 0 20474 0.499854 |
| 56 | 1 20486 0.500146 |
| 57 | |
| 58 | Total: 40960 1.000000 |
| 59 | |
| 60 | Entropy = 1.000000 bits per bit. |
| 61 | |
| 62 | Optimum compression would reduce the size |
| 63 | of this 40960 bit file by 0 percent. |
| 64 | |
| 65 | Chi square distribution for 40960 samples is 0.00, and randomly |
| 66 | would exceed this value 95.27 percent of the times. |
| 67 | |
| 68 | Arithmetic mean value of data bits is 0.5001 (0.5 = random). |
| 69 | Monte Carlo value for Pi is 3.109026964 (error 1.04 percent). |
| 70 | Serial correlation coefficient is -0.008399 (totally uncorrelated = 0.0). |
| 71 | |