From d800e12f597aaf57651fc4a7f5dde2f0399e23cf Mon Sep 17 00:00:00 2001 From: kichikuou Date: Fri, 14 Aug 2026 09:11:12 +0900 Subject: [PATCH] Math: Replace rand() with mt19937 On Windows RAND_MAX is 0x7fff, which makes Rand() and RandF() far too coarse. Use mt19937 instead so that seeded sequences reproduce the original engine's behavior. --- src/hll/Math.c | 34 ++++++++++++++++++++++++++++++---- test/Run/test.ain | Bin 29542 -> 30062 bytes test/Source/math.jaf | 19 +++++++++++++++++++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/hll/Math.c b/src/hll/Math.c index e6a263a..d3e07c8 100644 --- a/src/hll/Math.c +++ b/src/hll/Math.c @@ -23,9 +23,23 @@ #define M_PI (3.14159265358979323846) #endif +#include "system4/mt19937int.h" + #include "hll.h" #include "vm/page.h" +static struct mt19937 mt; +static bool mt_initialized; + +static uint32_t math_genrand(void) +{ + if (!mt_initialized) { + mt19937_init(&mt, 4357); + mt_initialized = true; + } + return mt19937_genrand(&mt); +} + struct shuffle_table { int id; struct shuffle_table *next; @@ -64,9 +78,16 @@ static float Math_Tan(float x) return tanf(deg2rad(x)); } +static void Math_SetSeed(int seed) +{ + mt19937_init(&mt, (uint32_t)seed | 1); + mt19937_genrand(&mt); // the original engine discards the first value + mt_initialized = true; +} + static void Math_SetSeedByCurrentTime(void) { - srand(time(NULL)); + Math_SetSeed(time(NULL)); } static int Math_Min(int a, int b) @@ -105,9 +126,14 @@ static void Math_SwapF(float *a, float *b) //void Math_SetRandMode(int mode); +static int Math_Rand(void) +{ + return math_genrand() & 0x7fffffff; +} + static float Math_RandF(void) { - return rand() * (1.0 / (RAND_MAX + 1U)); + return (float)(math_genrand() * (1.0 / 4294967296.0)); } static void shuffle_array(int *a, int len) @@ -192,10 +218,10 @@ HLL_LIBRARY(Math, HLL_EXPORT(Abs, abs), HLL_EXPORT(AbsF, fabsf), HLL_EXPORT(Pow, powf), - HLL_EXPORT(SetSeed, srand), + HLL_EXPORT(SetSeed, Math_SetSeed), HLL_EXPORT(SetSeedByCurrentTime, Math_SetSeedByCurrentTime), //HLL_EXPORT(SetRandMode, Math_SetRandMode), - HLL_EXPORT(Rand, rand), + HLL_EXPORT(Rand, Math_Rand), HLL_EXPORT(RandF, Math_RandF), HLL_EXPORT(RandTableInit, Math_RandTableInit), HLL_EXPORT(RandTable, Math_RandTable), diff --git a/test/Run/test.ain b/test/Run/test.ain index 77fd2ee7aa88d66d1d799871675284948a044c2e..af7afe5918af7a8500c5aa9487c95aeb7d76af6c 100644 GIT binary patch delta 12878 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 delta 12354 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 diff --git a/test/Source/math.jaf b/test/Source/math.jaf index 7db4057..ec903db 100755 --- a/test/Source/math.jaf +++ b/test/Source/math.jaf @@ -31,6 +31,25 @@ void test_math(void) test_float("Math.SwapF(a, b), a", fa, 2.0); test_float("Math.SwapF(a, b), b", fb, 1.0); + // The default seed is 4357. This must run before any other random + // number is drawn. + test_equal("Math.Rand() #1 (default seed)", Math.Rand(), 1362922229); + test_equal("Math.Rand() #2 (default seed)", Math.Rand(), 2143450242); + + Math.SetSeed(12345); + test_equal("Math.Rand() #1 (seed 12345)", Math.Rand(), 2120104832); + test_equal("Math.Rand() #2 (seed 12345)", Math.Rand(), 377474682); + + // SetSeed ORs the seed with 1. + Math.SetSeed(12344); + test_equal("Math.Rand() #1 (seed 12344)", Math.Rand(), 2120104832); + test_equal("Math.Rand() #2 (seed 12344)", Math.Rand(), 377474682); + + Math.SetSeed(12345); + test_float("Math.RandF() #1", Math.RandF(), 0.993625); + test_float("Math.RandF() #2", Math.RandF(), 0.587888); + test_float("Math.RandF() #3", Math.RandF(), 0.857469); + Math.RandTableInit(42, 10); for (i = 0; i < 10; i++) { ar[Math.RandTable(42)] = 1;