Fix PRNG randomization.
PCG32 doesn't like small seeds, which leads to zero random values (prior to #7532, zero values were handled as special cases). Use a large default seed, and also add a shift in Math::randomize. Fixes #8423.
This commit is contained in:
parent
6f9ec3acfc
commit
ceb699f5ec
@ -30,7 +30,7 @@
|
|||||||
#include "math_funcs.h"
|
#include "math_funcs.h"
|
||||||
#include "core/os/os.h"
|
#include "core/os/os.h"
|
||||||
|
|
||||||
pcg32_random_t Math::default_pcg = { 1, PCG_DEFAULT_INC_64 };
|
pcg32_random_t Math::default_pcg = { 12047754176567800795ULL, PCG_DEFAULT_INC_64 };
|
||||||
|
|
||||||
#define PHI 0x9e3779b9
|
#define PHI 0x9e3779b9
|
||||||
|
|
||||||
@ -51,9 +51,7 @@ void Math::seed(uint64_t x) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Math::randomize() {
|
void Math::randomize() {
|
||||||
|
seed(OS::get_singleton()->get_ticks_usec() * default_pcg.state + PCG_DEFAULT_INC_64);
|
||||||
OS::Time time = OS::get_singleton()->get_time();
|
|
||||||
seed(OS::get_singleton()->get_ticks_usec() * (time.hour + 1) * (time.min + 1) * (time.sec + 1) * rand()); // TODO: can be simplified.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Math::rand() {
|
uint32_t Math::rand() {
|
||||||
|
@ -157,7 +157,7 @@ public:
|
|||||||
|
|
||||||
static uint32_t larger_prime(uint32_t p_val);
|
static uint32_t larger_prime(uint32_t p_val);
|
||||||
|
|
||||||
static void seed(uint64_t x = 0);
|
static void seed(uint64_t x);
|
||||||
static void randomize();
|
static void randomize();
|
||||||
static uint32_t rand_from_seed(uint64_t *seed);
|
static uint32_t rand_from_seed(uint64_t *seed);
|
||||||
static uint32_t rand();
|
static uint32_t rand();
|
||||||
|
@ -507,7 +507,6 @@ OS::OS() {
|
|||||||
_render_thread_mode = RENDER_THREAD_SAFE;
|
_render_thread_mode = RENDER_THREAD_SAFE;
|
||||||
|
|
||||||
_allow_hidpi = true;
|
_allow_hidpi = true;
|
||||||
Math::seed(1234567);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OS::~OS() {
|
OS::~OS() {
|
||||||
|
Loading…
Reference in New Issue
Block a user