RosettaCodeData/Task/Pseudo-random-numbers-Splitmix64/C++/pseudo-random-numbers-splitmix64.cpp
2023-07-01 13:44:08 -04:00

49 lines
1,019 B
C++

#include <iostream>
#include <cmath>
#include <vector>
class Splitmix64 {
public:
Splitmix64() { state = 0; }
Splitmix64(const uint64_t seed) : state(seed) {}
void seed(const uint64_t seed) {
state = seed;
}
uint64_t next_int() {
uint64_t z = ( state += 0x9e3779b97f4a7c15 );
z = ( z ^ ( z >> 30 ) ) * 0xbf58476d1ce4e5b9;
z = ( z ^ ( z >> 27 ) ) * 0x94d049bb133111eb;
return z ^ ( z >> 31 );
}
double next_float() {
return next_int() / twoPower64;
}
private:
uint64_t state;
const double twoPower64 = pow(2.0, 64);
};
int main() {
Splitmix64 random;
random.seed(1234567);
for ( int32_t i = 0; i < 5; ++i ) {
std::cout << random.next_int() << std::endl;
}
std::cout << std::endl;
Splitmix64 rand(987654321);
std::vector<uint32_t> counts(5, 0);
for ( int32_t i = 0; i < 100'000; ++i ) {
uint32_t value = floor(rand.next_float() * 5.0);
counts[value] += 1;
}
for ( int32_t i = 0; i < 5; ++i ) {
std::cout << i << ": " << counts[i] << " ";
}
std::cout << std::endl;
}