static void dsfmt_chk_init_gen_rand(ref dsfmt_t dsfmt, uint32_t seed, int mexp) { int i; if (mexp != dsfmt_mexp) { Console.WriteLine("DSFMT_MEXP doesn't match with dSFMT.c\n"); exit(1); } putpsfmt32(ref dsfmt, idxof(0), seed); for (i = 1; i < (((19937 - 128) / 104 + 1) + 1) * 4; i++) { uint prev = getpsfmt32(ref dsfmt, idxof(i - 1)); uint tmp = 1812433253U * (prev ^ (prev >> 30)) + (uint)i; if (verbose) { Console.WriteLine("prev = {0}, loop[{1}] = {2}", prev, i, tmp); } putpsfmt32(ref dsfmt, idxof(i), tmp); } initial_mask(ref dsfmt); period_certification(ref dsfmt); dsfmt.idx = (((19937 - 128) / 104 + 1) * 2); }
static void period_certification(ref dsfmt_t dsfmt) { uint64_t[] pcv = new uint64_t[] { 0x3d84e1ac0dc82880UL, 0x0000000000000001UL }; uint64_t[] tmp = new uint64_t[2]; uint64_t inner; int i; tmp[0] = get_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2) ^ 0x90014964b32f4329UL; tmp[1] = get_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2 + 1) ^ 0x3b8d12ac548a7c7aUL; inner = tmp[0] & pcv[0]; inner ^= tmp[1] & pcv[1]; for (i = 32; i > 0; i >>= 1) { { inner ^= inner >> i; if (verbose) { Console.WriteLine("inner={0}", inner); } } } inner &= 1; if (inner == 1) { return; } put_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2 + 1, get_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2 + 1) ^ 1UL); return; }
static void Main() { Console.WriteLine("Starting"); dsfmt = new dsfmt_t(); Kiwi.Pause(); testGaussian(); Console.WriteLine("Ending"); }
static void putpsfmt32(ref dsfmt_t dsfmt, int idx, uint arg) { if (verbose) { Console.WriteLine("putpsfmt32 {0} {1:X8}", idx, arg); } copy(BitConverter.GetBytes(arg), dsfmt.status[idx / 4].array, (idx % 4) * 4); }
static void initial_mask(ref dsfmt_t dsfmt) { int i; for (i = 0; i < ((19937 - 128) / 104 + 1) * 2; i++) { put_ulong(dsfmt.status, i, (get_ulong(dsfmt.status, i) & 0x000FFFFFFFFFFFFFUL) | 0x3FF0000000000000UL); } }
static uint getpsfmt32(ref dsfmt_t dsfmt, int idx) { uint tmp = BitConverter.ToUInt32(dsfmt.status[idx / 4].array, (idx % 4) * 4); if (verbose) { Console.WriteLine("getpsfmt32 {0} {1:X8}", idx, tmp); } return(tmp); }
static uint getpsfmt32(ref dsfmt_t dsfmt, int idx) { ulong tmp2 = dsfmt.status[idx / 4].pair[(idx / 2) % 2]; uint tmp = ((idx & 1) == 1) ? (uint)(tmp2 >> 32) : (uint)(tmp2 & 0xFFFFFFFF); if (verbose) { Console.WriteLine("getpsfmt32 {0} {1:X8}", idx, tmp); } return(tmp); }
static void dsfmt_fill_array_open_open(ref dsfmt_t dsfmt, double[] array, int size) { w128_t [] warray = new w128_t [size / 2]; for (int i = 0; i < warray.Length; i++) { warray[i] = new w128_t(); } gen_rand_array_o0o1(ref dsfmt, ref warray, size / 2); for (int i = 0; i < size; i++) { array [i] = get_double(warray, i); } }
static void gen_rand_array_o0o1(ref dsfmt_t dsfmt, ref w128_t[] array, int size) { int i; int j; w128_t[] lung = new w128_t[1]; lung [0] = new w128_t(); if (verbose) { Console.WriteLine("gen_rand_array_o0o1"); } put_ulong(lung, 0, get_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2)); put_ulong(lung, 1, get_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2 + 1)); do_recursion(ref array, 0, ref dsfmt.status, 0, ref dsfmt.status, 117, ref lung); for (i = 1; i < ((19937 - 128) / 104 + 1) - 117; i++) { do_recursion(ref array, i, ref dsfmt.status, i, ref dsfmt.status, i + 117, ref lung); } for ( ; i < ((19937 - 128) / 104 + 1); i++) { do_recursion(ref array, i, ref dsfmt.status, i, ref array, i + 117 - ((19937 - 128) / 104 + 1), ref lung); } for ( ; i < size - ((19937 - 128) / 104 + 1); i++) { do_recursion(ref array, i, ref array, i - ((19937 - 128) / 104 + 1), ref array, i + 117 - ((19937 - 128) / 104 + 1), ref lung); convert_o0o1(ref array, (i - ((19937 - 128) / 104 + 1))); } for (j = 0; j < 2 * ((19937 - 128) / 104 + 1) - size; j++) { put_ulong(dsfmt.status, j * 2, get_ulong(array, (j + size - ((19937 - 128) / 104 + 1)) * 2)); put_ulong(dsfmt.status, j * 2 + 1, get_ulong(array, (j + size - ((19937 - 128) / 104 + 1)) * 2 + 1)); } for ( ; i < size; i++, j++) { do_recursion(ref array, i, ref array, i - ((19937 - 128) / 104 + 1), ref array, i + 117 - ((19937 - 128) / 104 + 1), ref lung); put_ulong(dsfmt.status, j * 2, get_ulong(array, i * 2)); put_ulong(dsfmt.status, j * 2 + 1, get_ulong(array, i * 2 + 1)); convert_o0o1(ref array, (i - ((19937 - 128) / 104 + 1))); } for (i = size - ((19937 - 128) / 104 + 1); i < size; i++) { convert_o0o1(ref array, i); } put_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2, get_ulong(lung, 0)); put_ulong(dsfmt.status, ((19937 - 128) / 104 + 1) * 2 + 1, get_ulong(lung, 1)); }
static void putpsfmt32(ref dsfmt_t dsfmt, int idx, uint arg) { if (verbose) { Console.WriteLine("putpsfmt32 {0} {1:X8}", idx, arg); } if ((idx & 1) == 1) { dsfmt.status[idx / 4].pair[(idx / 2) % 2] = (dsfmt.status[idx / 4].pair[(idx / 2) % 2] & 0xFFFFFFFFUL) | (((ulong)arg) << 32); } else { dsfmt.status[idx / 4].pair[(idx / 2) % 2] = (dsfmt.status[idx / 4].pair[(idx / 2) % 2] & 0xFFFFFFFF00000000UL) | arg; } }
static void dsfmt_init_gen_rand(ref dsfmt_t dsfmt, uint32_t seed) { dsfmt_chk_init_gen_rand(ref dsfmt, seed, 19937); }
static void Main() { dsfmt = new dsfmt_t(); testGaussian(); }