OSDN Git Service

screen.c
[heavyosecpu/HeavyOSECPU.git] / randmt.c
1 \r
2 #include "osecpu.h"\r
3 \r
4 static struct {\r
5         unsigned stat[4], mat1, mat2, tmat;\r
6 } randStat;\r
7 \r
8 // tinyMTの32bit版のアルゴリズムを使っています : http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/index-jp.html\r
9 void randStatNext()\r
10 {\r
11         unsigned x, y;\r
12         x = (randStat.stat[0] & 0x7fffffff) ^ randStat.stat[1] ^ randStat.stat[2];\r
13         y = randStat.stat[3];\r
14         x ^= x << 1;\r
15         y ^= (y >> 1) ^ x;\r
16         randStat.stat[1] = randStat.stat[2] ^ (-((int)(y & 1)) & randStat.mat1);\r
17         randStat.stat[2] = x ^ (y << 10) ^ (-((int)(y & 1)) & randStat.mat2);\r
18         randStat.stat[3] = y;\r
19         return;\r
20 }\r
21 \r
22 void randStatInit(unsigned seed)\r
23 {\r
24         int i;\r
25         randStat.stat[0] = seed;\r
26         randStat.stat[1] = randStat.mat1 = 0x8f7011ee;\r
27         randStat.stat[2] = randStat.mat2 = 0xfc78ff1f;\r
28         randStat.stat[3] = randStat.tmat = 0x3793fdff;\r
29         for (i = 1; i < 8; i++){\r
30                 randStat.stat[i & 3] ^= i + ((unsigned)1812433253) * (randStat.stat[(i - 1) & 3] ^ (randStat.stat[(i - 1) & 3] >> 30));\r
31         }\r
32         for (i = 0; i < 8; i++){\r
33                 randStatNext();\r
34         }\r
35         return;\r
36 }\r
37 \r
38 unsigned int randGetNextUInt32(void)\r
39 {\r
40         //次の乱数を取得する。\r
41         unsigned int u32t;\r
42         \r
43         randStatNext();\r
44         u32t = randStat.stat[0] + (randStat.stat[2] >> 8);\r
45         return (randStat.stat[3] ^ u32t ^ (-((int)(u32t & 1)) & randStat.tmat));\r
46 }\r