9 #ifndef CRYPTOPP_MERSENNE_TWISTER_H
10 #define CRYPTOPP_MERSENNE_TWISTER_H
16 NAMESPACE_BEGIN(CryptoPP)
30 template <
unsigned int K,
unsigned int M,
unsigned int N,
unsigned int F,
unsigned long S>
41 for (
unsigned int i = 1; i < N+1; i++)
42 m_state[i] = word32(F * (m_state[i-1] ^ (m_state[i-1] >> 30)) + i);
56 for (
size_t i=0; i < size/4; i++, output += 4)
58 #if defined(CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS) && defined(IS_LITTLE_ENDIAN)
59 *((word32*)output) =
ByteReverse(NextMersenneWord());
60 #elif defined(CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS)
61 *((word32*)output) = NextMersenneWord();
63 temp = NextMersenneWord();
64 output[3] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 0);
65 output[2] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 1);
66 output[1] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 2);
67 output[0] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 3);
75 *((
volatile word32*)&temp) = 0;
80 temp = NextMersenneWord();
83 case 3: output[2] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 1);
84 case 2: output[1] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 2);
85 case 1: output[0] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 3);
break;
91 *((
volatile word32*)&temp) = 0;
100 const word32 range = max-min;
101 if (range == 0xffffffffL)
102 return NextMersenneWord();
108 value =
Crop(NextMersenneWord(), maxBits);
109 }
while (value > range);
132 word32 NextMersenneWord()
134 if (m_idx >= N) { Twist(); }
136 word32 temp = m_state[m_idx++];
138 temp ^= (temp >> 11);
139 temp ^= (temp << 7) & 0x9D2C5680;
140 temp ^= (temp << 15) & 0xEFC60000;
142 return temp ^ (temp >> 18);
148 static const unsigned long magic[2]={0x0UL, K};
152 for (kk=0;kk<N-M;kk++)
154 temp = (m_state[kk] & 0x80000000)|(m_state[kk+1] & 0x7FFFFFFF);
155 m_state[kk] = m_state[kk+M] ^ (temp >> 1) ^ magic[temp & 0x1UL];
160 temp = (m_state[kk] & 0x80000000)|(m_state[kk+1] & 0x7FFFFFFF);
161 m_state[kk] = m_state[kk+(M-N)] ^ (temp >> 1) ^ magic[temp & 0x1UL];
164 temp = (m_state[N-1] & 0x80000000)|(m_state[0] & 0x7FFFFFFF);
165 m_state[N-1] = m_state[M-1] ^ (temp >> 1) ^ magic[temp & 0x1UL];
171 *((
volatile word32*)&temp) = 0;
190 #if CRYPTOPP_DOXYGEN_PROCESSING
203 #if CRYPTOPP_DOXYGEN_PROCESSING
204 class MT19937ar :
public MersenneTwister<0x9908B0DF , 397, 624, 0x6C078965 , 5489> {};
206 typedef MersenneTwister<0x9908B0DF , 397, 624, 0x6C078965 , 5489>
MT19937ar;
211 #endif // CRYPTOPP_MERSENNE_TWISTER_H
Utility functions for the Crypto++ library.
Mersenne Twister class for Monte-Carlo simulations.
Abstract base classes that provide a uniform interface to this library.
Interface for random number generators.
Classes and functions for secure memory allocations.
T Crop(T value, size_t bits)
Truncates the value to the specified number of bits.
void DiscardBytes(size_t n)
Generate and discard n bytes.
Original MT19937 generator provided in the ACM paper.
void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
Updated MT19937 generator adapted to provide an array for initialization.
T1 RoundUpToMultipleOf(const T1 &n, const T2 &m)
Rounds a value up to a multiple of a second value.
word32 GenerateWord32(word32 min=0, word32 max=0xffffffffL)
Generate a random 32-bit word in the range min to max, inclusive.
byte ByteReverse(byte value)
Reverses bytes in a 8-bit value.
unsigned int BitPrecision(const T &value)
Returns the number of bits required for a value.
MersenneTwister(unsigned long seed=S)
Construct a Mersenne Twister.