4 #ifdef _MSC_VER //Windows Visual Studio 14 void init_genrand64(uint64_t seed);
15 uint64_t genrand64_int64(
void);
29 printf(
"Cayley32: A pseudorandom number generator based on the ");
30 printf(
"symmetric group S_23.\n");
31 printf(
"Usage:\ngenerator.exe [-s seed] [-g] [-ge] [-gm] [-h]\n");
32 printf(
" -s n: Seed n, a hex number (defaults to fixed value)\n");
33 printf(
" -g: Generate infinite Cayley32 pseudorandom bits\n");
34 printf(
" -ge: Generate infinite Cayley32e pseudorandom bits\n");
35 printf(
" -gm: Generate infinite Mersenne Twister pseudorandom bits\n");
36 printf(
" -h: This help.\n");
37 printf(
"To report run-time: ./generator.exe\n");
38 printf(
"To test with DieHarder: ");
39 printf(
"./generator.exe -s 99999 -g | dieharder -g 200 -a\n");
54 for(
int i=1; i<argc; i++){
55 std::string s0 = argv[i];
85 template<
typename t>
void Generate(
const t& rnd, uint64_t nBufSize){
86 const FILE* unused = freopen(
nullptr,
"wb", stdout);
88 uint64_t* buffer =
new uint64_t[nBufSize];
93 for(uint64_t i=0; i<nBufSize; i++)
96 const size_t bytecount = nBufSize*
sizeof(uint64_t);
97 fwrite((uint8_t*)buffer, bytecount, 1, stdout);
110 template<
typename t>
double Time(
const t& rand, uint64_t n){
113 for(uint32_t i=0; i<n; i++)
127 const uint32_t mb = (8*n*
sizeof(uint64_t))/1048576LL;
129 printf(
"Timing the generation of %u Megabits ", mb);
130 printf(
"by Cayley32 and the Mersenne Twister.\n");
132 const double t0 =
Time([&](){pCayley->
rand();}, n);
133 printf(
"Cayley32: %0.2f nanoseconds per bit\n", t0);
135 const double t1 =
Time([&](){genrand64_int64();}, n);
136 printf(
"Mersenne Twister: %0.2f nanoseconds per bit\n", t1);
138 printf(
"Cayley32 is %0.1f times slower\n", t0/t1);
147 int main(
int argc,
char *argv[]){
153 init_genrand64((uint64_t)seed);
156 cayley32e.
srand(genrand64_int64);
159 cayley32.
srand(seed);
164 const uint32_t nBufSize = 10485760;
168 Time(&cayley32, 33554432);
170 #ifdef _MSC_VER //Windows Visual Studio 171 _cputs(
"\nHit Almost Any Key to Exit...\n");
180 case Task::GenerateEx:
184 case Task::GenerateMT:
185 Generate([&](){
return genrand64_int64();}, nBufSize);
The Cayley PRNG over with fixed generators.
void Generate(const t &rnd, uint64_t nBufSize)
Write an infinite number of pseudorandom bits to stdout.
void GetParams(int argc, char *argv[], uintx_t &seed, Task &t)
Get generator parameters from argv.
double Time(const t &rand, uint64_t n)
Time a PRNG.
int main(int argc, char *argv[])
Main.
Declaration of the extensible unsigned integer class.
void srand(uintx_t &seed)
Seed the generator.
Declaration of the Cayley32 pseudo-random number generator.
uint64_t CPUTimeInNanoseconds()
CPU time in nanoseconds.
The extensible unsigned integer class.
void PrintHelp()
Print help.
virtual void srand(uint64_t(*rnd)(void))
Seed the generator.
The Cayley PRNG over with pseudo-random generators.
uint64_t rand()
Generate 64 pseudo-random bits.