#include "SDL_internal.h"
static Uint64 SDL_rand_state;
static bool SDL_rand_initialized = false;
void SDL_srand(Uint64 seed)
{
if (!seed) {
seed = SDL_GetPerformanceCounter();
}
SDL_rand_state = seed;
SDL_rand_initialized = true;
}
Sint32 SDL_rand(Sint32 n)
{
if (!SDL_rand_initialized) {
SDL_srand(0);
}
return SDL_rand_r(&SDL_rand_state, n);
}
float SDL_randf(void)
{
if (!SDL_rand_initialized) {
SDL_srand(0);
}
return SDL_randf_r(&SDL_rand_state);
}
Uint32 SDL_rand_bits(void)
{
if (!SDL_rand_initialized) {
SDL_srand(0);
}
return SDL_rand_bits_r(&SDL_rand_state);
}
Uint32 SDL_rand_bits_r(Uint64 *state)
{
if (!state) {
return 0;
}
*state = *state * 0xff1cd035ul + 0x05;
return (Uint32)(*state >> 32);
}
Sint32 SDL_rand_r(Uint64 *state, Sint32 n)
{
if (n < 0) {
return 0;
}
Uint64 val = (Uint64)SDL_rand_bits_r(state) * n;
return (Sint32)(val >> 32);
}
float SDL_randf_r(Uint64 *state)
{
#if (defined(_MSC_VER) && (_MSC_VER < 1913)) || (!defined(_MSC_VER) && (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)))
const union { Uint32 u32; float f; } float_union = { 0x33800000U };
return (SDL_rand_bits_r(state) >> (32 - 24)) * float_union.f;
#else
return (SDL_rand_bits_r(state) >> (32 - 24)) * 0x1p-24f;
#endif
}