1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- //
- // rand.h
- // cocos2d_libs
- //
- // Created by 徐俊杰 on 2020/5/25.
- //
- #ifndef rand_h
- #define rand_h
- #include "rparticle/Macros/RParticleMacros.h"
- /*
- Some random generator timings:
- MacBook Pro w/ Core 2 Duo 2.4GHz. Times are for gcc 4.0.1 (OS X 10.6.2) / VS2008 SP1 (Win XP SP3),
- in milliseconds for this loop (4915200 calls):
-
- for (int j = 0; j < 100; ++j)
- for (int i = 0; i < 128*128*3; ++i)
- data[i] = (rnd.get() & 0x3) << 6;
-
- gcc vs2008 Size
- C's rand(): 57.0 109.3 ms 1
- Mersenne Twister: 56.0 37.4 ms 2500
- Unity 2.x LCG: 11.1 9.2 ms 4
- Xorshift 128: 15.0 17.8 ms 16
- Xorshift 32: 20.6 10.7 ms 4
- WELL 512: 43.6 55.1 ms 68
- */
- NS_RRP_BEGIN
- // Xorshift 128 implementation
- // Xorshift paper: http://www.jstatsoft.org/v08/i14/paper
- // Wikipedia: http://en.wikipedia.org/wiki/Xorshift
- class Rand {
- public:
-
- Rand (UInt32 seed = 0)
- {
- SetSeed (seed);
- }
-
- UInt32 Get ()
- {
- UInt32 t;
- t = x ^ (x << 11);
- x = y; y = z; z = w;
- return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
- }
-
- inline static float GetFloatFromInt (UInt32 value)
- {
- // take 23 bits of integer, and divide by 2^23-1
- return float(value & 0x007FFFFF) * (1.0f / 8388607.0f);
- }
-
- inline static UInt8 GetByteFromInt (UInt32 value)
- {
- // take the most significant byte from the 23-bit value
- return UInt8(value >> (23 - 8));
- }
-
- // random number between 0.0 and 1.0
- float GetFloat ()
- {
- return GetFloatFromInt (Get ());
- }
-
- // random number between -1.0 and 1.0
- float GetSignedFloat ()
- {
- return GetFloat() * 2.0f - 1.0f;
- }
-
- void SetSeed (UInt32 seed)
- {
- x = seed;
- y = x * 1812433253U + 1;
- z = y * 1812433253U + 1;
- w = z * 1812433253U + 1;
- }
-
- UInt32 GetSeed () const { return x; }
-
- private:
- UInt32 x, y, z, w;
- };
- NS_RRP_END
- #endif /* rand_h */
|