OSDN Git Service

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