Просмотр исходного кода

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.
Ferenc Arn 8 лет назад
Родитель
Сommit
ceb699f5ec
3 измененных файлов с 3 добавлено и 6 удалено
  1. 2 4
      core/math/math_funcs.cpp
  2. 1 1
      core/math/math_funcs.h
  3. 0 1
      core/os/os.cpp

+ 2 - 4
core/math/math_funcs.cpp

@@ -30,7 +30,7 @@
 #include "math_funcs.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
 
@@ -51,9 +51,7 @@ void Math::seed(uint64_t x) {
 }
 
 void Math::randomize() {
-
-	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.
+	seed(OS::get_singleton()->get_ticks_usec() * default_pcg.state + PCG_DEFAULT_INC_64);
 }
 
 uint32_t Math::rand() {

+ 1 - 1
core/math/math_funcs.h

@@ -157,7 +157,7 @@ public:
 
 	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 uint32_t rand_from_seed(uint64_t *seed);
 	static uint32_t rand();

+ 0 - 1
core/os/os.cpp

@@ -507,7 +507,6 @@ OS::OS() {
 	_render_thread_mode = RENDER_THREAD_SAFE;
 
 	_allow_hidpi = true;
-	Math::seed(1234567);
 }
 
 OS::~OS() {