diff --git a/src/rcore.c b/src/rcore.c index 5a630b99e..04f419eee 100644 --- a/src/rcore.c +++ b/src/rcore.c @@ -1743,7 +1743,30 @@ int GetRandomValue(int min, int max) TRACELOG(LOG_WARNING, "Invalid GetRandomValue() arguments, range should not be higher than %i", RAND_MAX); } - value = (rand()%(abs(max - min) + 1) + min); + int range = (max - min) + 1; + + // Degenerate/overflow case: fall back to min (same behavior as "always min" instead of UB) + if (range <= 0) + { + value = min; + } + else + { + // Rejection sampling to get a uniform integer in [min, max] + unsigned long c = (unsigned long)RAND_MAX + 1UL; // number of possible rand() results + unsigned long m = (unsigned long)range; // size of the target interval + unsigned long t = c - (c % m); // largest multiple of m <= c + unsigned long r; + + for (;;) + { + r = (unsigned long)rand(); + if (r < t) break; // Only accept values within the fair region + } + + + value = min + (int)(r % m); + } #endif return value; }