Improve RNG

This commit is contained in:
savis
2025-12-25 20:46:01 +01:00
parent 2663bb4c9c
commit ab382cac7c
7 changed files with 1663 additions and 54 deletions

View File

@@ -91,7 +91,7 @@ DWORD DESC_MANAGER::CreateHandshake()
RETRY:
do
{
DWORD val = thecore_random() % (1024 * 1024);
DWORD val = number(0, (1024 * 1024));
*(DWORD *) (crc_buf ) = val;
*((DWORD *) crc_buf + 1) = get_global_time();
@@ -383,7 +383,7 @@ void DESC_MANAGER::GetUserCount(int & iTotal, int ** paiEmpireUserCount, int & i
DWORD DESC_MANAGER::MakeRandomKey(DWORD dwHandle)
{
DWORD random_key = thecore_random();
DWORD random_key = number(0, INT_MAX);
m_map_handle_random_key.insert(std::make_pair(dwHandle, random_key));
return random_key;
}

View File

@@ -541,8 +541,8 @@ void CThreeWayWar::onDead(LPCHARACTER pChar, LPCHARACTER pkKiller)
int x = pChar->GetX();
int y = pChar->GetY();
x = (thecore_random() & 1) ? x - number(200, 1000) : x + number(200, 1000);
y = (thecore_random() & 1) ? y - number(200, 1000) : y + number(200, 1000);
x = (number(0, 1)) ? x - number(200, 1000) : x + number(200, 1000);
y = (number(0, 1)) ? y - number(200, 1000) : y + number(200, 1000);
if (x < 0)
x = pChar->GetX();

View File

@@ -26,7 +26,7 @@ int dice(int number, int size)
while (number)
{
val = ((thecore_random() % size) + 1);
val = number(1, size);
sum += val;
--number;
}
@@ -146,41 +146,6 @@ int CalculateDuration(int iSpd, int iDur)
return iDur * i / 100;
}
double uniform_random(double a, double b)
{
// Uses 64-bit precision and the full range of the 32-bit DWORD
const double MAX_DIVISOR = 4294967296.0;
return (static_cast<double>(thecore_random()) / MAX_DIVISOR) * (b - a) + a;
//return thecore_random() / (RAND_MAX + 1.f) * (b - a) + a;
}
float gauss_random(float avg, float sigma)
{
static bool haveNextGaussian = false;
static float nextGaussian = 0.0f;
if (haveNextGaussian)
{
haveNextGaussian = false;
return nextGaussian * sigma + avg;
}
else
{
double v1, v2, s;
do {
//v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0
//v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0
v1 = uniform_random(-1.f, 1.f);
v2 = uniform_random(-1.f, 1.f);
s = v1 * v1 + v2 * v2;
} while (s >= 1.f || fabs(s) < FLT_EPSILON);
double multiplier = sqrtf(-2 * logf(s)/s);
nextGaussian = v2 * multiplier;
haveNextGaussian = true;
return v1 * multiplier * sigma + avg;
}
}
int parse_time_str(const char* str)
{

View File

@@ -59,8 +59,6 @@ extern const char * first_cmd(const char *argument, char *first_arg, size_t firs
extern int CalculateDuration(int iSpd, int iDur);
extern float gauss_random(float avg = 0, float sigma = 1);
extern int parse_time_str(const char* str);
extern bool WildCaseCmp(const char *w, const char *s);