the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 106 lines 2.1 kB view raw
1#include "stdafx.h" 2#include "Random.h" 3#include "System.h" 4 5Random::Random() 6{ 7 // 4J - jave now uses the system nanosecond counter added to a "seedUniquifier" to get an initial seed. Our nanosecond timer is actually only millisecond accuate, so 8 // use QueryPerformanceCounter here instead 9 __int64 seed; 10 QueryPerformanceCounter((LARGE_INTEGER *)&seed); 11 seed += 8682522807148012LL; 12 13 setSeed(seed); 14} 15 16Random::Random(__int64 seed) 17{ 18 setSeed(seed); 19} 20 21void Random::setSeed(__int64 s) 22{ 23 this->seed = (s ^ 0x5DEECE66DLL) & ((1LL << 48) - 1); 24 haveNextNextGaussian = false; 25} 26 27int Random::next(int bits) 28{ 29 seed = (seed * 0x5DEECE66DLL + 0xBLL) & ((1LL << 48) - 1); 30 return (int)(seed >> (48 - bits)); 31} 32 33void Random::nextBytes(byte *bytes, unsigned int count) 34{ 35 for(unsigned int i = 0; i < count; i++ ) 36 { 37 bytes[i] = (byte)next(8); 38 } 39} 40 41double Random::nextDouble() 42{ 43 44 return (((__int64)next(26) << 27) + next(27)) 45 / (double)(1LL << 53); 46} 47 48double Random::nextGaussian() 49{ 50 if (haveNextNextGaussian) 51 { 52 haveNextNextGaussian = false; 53 return nextNextGaussian; 54 } 55 else 56 { 57 double v1, v2, s; 58 do 59 { 60 v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0 61 v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0 62 s = v1 * v1 + v2 * v2; 63 } while (s >= 1 || s == 0); 64 double multiplier = sqrt(-2 * log(s)/s); 65 nextNextGaussian = v2 * multiplier; 66 haveNextNextGaussian = true; 67 return v1 * multiplier; 68 } 69} 70 71int Random::nextInt() 72{ 73 return next(32); 74} 75 76int Random::nextInt(int n) 77{ 78 assert (n>0); 79 80 81 if ((n & -n) == n) // i.e., n is a power of 2 82 return (int)(((__int64)next(31) * n) >> 31); // 4J Stu - Made __int64 instead of long 83 84 int bits, val; 85 do 86 { 87 bits = next(31); 88 val = bits % n; 89 } while(bits - val + (n-1) < 0); 90 return val; 91} 92 93float Random::nextFloat() 94{ 95 return next(24) / ((float)(1 << 24)); 96} 97 98__int64 Random::nextLong() 99{ 100 return ((__int64)next(32) << 32) + next(32); 101} 102 103bool Random::nextBoolean() 104{ 105 return next(1) != 0; 106}