LibC: Add rand() and srand() implementation
This code is from the wikipedia page for Permuted congruential generator
This commit is contained in:
parent
044378cfa3
commit
692b77fb8e
|
@ -204,3 +204,32 @@ void free(void* ptr)
|
|||
return;
|
||||
syscall(SYS_FREE, ptr);
|
||||
}
|
||||
|
||||
|
||||
// Constants and algorithm from https://en.wikipedia.org/wiki/Permuted_congruential_generator
|
||||
|
||||
static uint64_t s_rand_state = 0x4d595df4d0f33173;
|
||||
static constexpr uint64_t s_rand_multiplier = 6364136223846793005;
|
||||
static constexpr uint64_t s_rand_increment = 1442695040888963407;
|
||||
|
||||
static constexpr uint32_t rotr32(uint32_t x, unsigned r)
|
||||
{
|
||||
return x >> r | x << (-r & 31);
|
||||
}
|
||||
|
||||
int rand(void)
|
||||
{
|
||||
uint64_t x = s_rand_state;
|
||||
unsigned count = (unsigned)(x >> 59);
|
||||
|
||||
s_rand_state = x * s_rand_multiplier + s_rand_increment;
|
||||
x ^= x >> 18;
|
||||
|
||||
return rotr32(x >> 27, count) % RAND_MAX;
|
||||
}
|
||||
|
||||
void srand(unsigned int seed)
|
||||
{
|
||||
s_rand_state = seed + s_rand_increment;
|
||||
(void)rand();
|
||||
}
|
Loading…
Reference in New Issue