Fix Random.hx for GDScript

This commit is contained in:
2025-10-30 19:22:39 -05:00
parent 8caad092be
commit f93786ed91
3 changed files with 78 additions and 25 deletions

View File

@@ -1,6 +1,6 @@
class_name Random class_name Random
static var _arrayFloatHelper: Array[float] = null static var _arrayFloatHelper: Array[float] = []
var initialSeed: int = 1 var initialSeed: int = 1
var _hasFloatNormalSpare: bool = false var _hasFloatNormalSpare: bool = false
@@ -132,14 +132,20 @@ func resetInitialSeed() -> int:
self.internalSeed = int(tempNumber2) self.internalSeed = int(tempNumber2)
var tempRight: int = int(self.internalSeed) var tempRight: int = int(self.internalSeed)
var tempResult: int = self.initialSeed = tempRight
return tempResult self.initialSeed = tempRight
return self.initialSeed
func _int(Min: int = 0, Max: int = 2147483647, Excludes = null) -> int: func _int(Min: int = 0, Max: int = 2147483647, Excludes = null) -> int:
if (Min == 0 && Max == 2147483647 && Excludes == null): if (Min == 0 && Max == 2147483647 && Excludes == null):
self.internalSeed = self.internalSeed * 48271.0 % 2147483647 var tempNumber
return int(self.internalSeed) if true:
var intermediate: float = self.internalSeed * 48271.0
var intermediate2: int = int(intermediate)
self.internalSeed = intermediate2 % 2147483647
tempNumber = self.internalSeed
return int(tempNumber)
else: else:
if (Min == Max): if (Min == Max):
return Min return Min
@@ -151,8 +157,13 @@ func _int(Min: int = 0, Max: int = 2147483647, Excludes = null) -> int:
if (Excludes == null): if (Excludes == null):
var tempResult var tempResult
if true: if true:
self.internalSeed = self.internalSeed * 48271.0 % 2147483647 var tempLeft
var v: float = Min + (self.internalSeed) / 2147483647 * (Max - Min + 1) if true:
var intermediate: float = self.internalSeed * 48271.0
var intermediate2: int = int(intermediate)
self.internalSeed = intermediate2 % 2147483647
tempLeft = self.internalSeed
var v: float = Min + tempLeft / 2147483647 * (Max - Min + 1)
tempResult = int(floor(v)) tempResult = int(floor(v))
return tempResult return tempResult
else: else:
@@ -160,8 +171,13 @@ func _int(Min: int = 0, Max: int = 2147483647, Excludes = null) -> int:
while true: while true:
var tempRight var tempRight
if true: if true:
self.internalSeed = self.internalSeed * 48271.0 % 2147483647 var tempLeft1
var v: float = Min + (self.internalSeed) / 2147483647 * (Max - Min + 1) if true:
var intermediate: float = self.internalSeed * 48271.0
var intermediate2: int = int(intermediate)
self.internalSeed = intermediate2 % 2147483647
tempLeft1 = self.internalSeed
var v: float = Min + tempLeft1 / 2147483647 * (Max - Min + 1)
tempRight = int(floor(v)) tempRight = int(floor(v))
result = tempRight result = tempRight
if !(Excludes.find(result) >= 0): if !(Excludes.find(result) >= 0):
@@ -172,8 +188,13 @@ func _float(Min: float = 0, Max: float = 1, Excludes = null) -> float:
var result: float = 0 var result: float = 0
if (Min == 0 && Max == 1 && Excludes == null): if (Min == 0 && Max == 1 && Excludes == null):
self.internalSeed = self.internalSeed * 48271.0 % 2147483647 var tempLeft
return (self.internalSeed) / 2147483647 if true:
var intermediate: float = self.internalSeed * 48271.0
var intermediate2: int = int(intermediate)
self.internalSeed = intermediate2 % 2147483647
tempLeft = self.internalSeed
return tempLeft / 2147483647
else: else:
if (Min == Max): if (Min == Max):
result = Min result = Min
@@ -183,12 +204,22 @@ func _float(Min: float = 0, Max: float = 1, Excludes = null) -> float:
Max = Min - Max Max = Min - Max
Min = Min - Max Min = Min - Max
if (Excludes == null): if (Excludes == null):
self.internalSeed = self.internalSeed * 48271.0 % 2147483647 var tempLeft1
result = Min + (self.internalSeed) / 2147483647 * (Max - Min) if true:
var intermediate: float = self.internalSeed * 48271.0
var intermediate2: int = int(intermediate)
self.internalSeed = intermediate2 % 2147483647
tempLeft1 = self.internalSeed
result = Min + tempLeft1 / 2147483647 * (Max - Min)
else: else:
while true: while true:
self.internalSeed = self.internalSeed * 48271.0 % 2147483647 var tempLeft2
result = Min + (self.internalSeed) / 2147483647 * (Max - Min) if true:
var intermediate: float = self.internalSeed * 48271.0
var intermediate2: int = int(intermediate)
self.internalSeed = intermediate2 % 2147483647
tempLeft2 = self.internalSeed
result = Min + tempLeft2 / 2147483647 * (Max - Min)
if !(Excludes.find(result) >= 0): if !(Excludes.find(result) >= 0):
break break
@@ -201,12 +232,25 @@ func floatNormal(Mean: float = 0, StdDev: float = 1) -> float:
return Mean + scale * self._floatNormalRand2 return Mean + scale * self._floatNormalRand2
self._hasFloatNormalSpare = true self._hasFloatNormalSpare = true
self.internalSeed = self.internalSeed * 48271.0 % 2147483647
var theta: float = self._twoPI * ((self.internalSeed) / 2147483647) var tempLeft
self.internalSeed = self.internalSeed * 48271.0 % 2147483647 if true:
self._floatNormalRho = sqrt(-2 * log(1 - (self.internalSeed) / 2147483647)) var intermediate: float = self.internalSeed * 48271.0
var intermediate2: int = int(intermediate)
self.internalSeed = intermediate2 % 2147483647
tempLeft = self.internalSeed
var theta: float = self._twoPI * (tempLeft / 2147483647)
var tempLeft1
if true:
var intermediate: float = self.internalSeed * 48271.0
var intermediate2: int = int(intermediate)
self.internalSeed = intermediate2 % 2147483647
tempLeft1 = self.internalSeed
self._floatNormalRho = sqrt(-2 * log(1 - tempLeft1 / 2147483647))
var scale: float = StdDev * self._floatNormalRho var scale: float = StdDev * self._floatNormalRho
@@ -258,7 +302,10 @@ func weightedPick(WeightsArray: Array[float]) -> int:
return pick return pick
func generate() -> float: func generate() -> float:
self.internalSeed = self.internalSeed * 48271.0 % 2147483647 var intermediate: float = self.internalSeed * 48271.0
var intermediate2: int = int(intermediate)
self.internalSeed = intermediate2 % 2147483647
return self.internalSeed return self.internalSeed

View File

@@ -53,7 +53,7 @@
"CallStack.gd", "CallStack.gd",
"Alt.gd" "Alt.gd"
], ],
"id": 16, "id": 25,
"wasCached": false, "wasCached": false,
"version": 1 "version": 1
} }

View File

@@ -44,7 +44,8 @@ class Random {
* @return The new initial seed. * @return The new initial seed.
*/ */
public inline function resetInitialSeed():Int { public inline function resetInitialSeed():Int {
return initialSeed = rangeBound(Std.int(Math.random() * MAX_VALUE_INT)); initialSeed = rangeBound(Std.int(Math.random() * MAX_VALUE_INT));
return initialSeed;
} }
/** /**
@@ -280,7 +281,12 @@ class Random {
* @return A new pseudorandom number. * @return A new pseudorandom number.
*/ */
inline function generate():Float { inline function generate():Float {
return internalSeed = (internalSeed * MULTIPLIER) % MODULUS; var intermediate = (internalSeed * MULTIPLIER);
#if gdscript
var intermediate = Std.int(intermediate);
#end
internalSeed = intermediate % MODULUS;
return internalSeed;
} }
/** /**
@@ -321,7 +327,7 @@ class Random {
/** /**
* Internal shared helper variable. Used by getObject(). * Internal shared helper variable. Used by getObject().
*/ */
static var _arrayFloatHelper:Array<Float> = null; static var _arrayFloatHelper:Array<Float> = [];
/** /**
* Constants used in the pseudorandom number generation equation. * Constants used in the pseudorandom number generation equation.
@@ -332,7 +338,7 @@ class Random {
* @see Stephen K. Park and Keith W. Miller and Paul K. Stockmeyer (1988). * @see Stephen K. Park and Keith W. Miller and Paul K. Stockmeyer (1988).
* "Technical Correspondence". Communications of the ACM 36 (7): 105110. * "Technical Correspondence". Communications of the ACM 36 (7): 105110.
*/ */
static inline var MULTIPLIER:Float = 48271.0; static inline var MULTIPLIER:Float = 48271;
static inline var MODULUS:Int = MAX_VALUE_INT; static inline var MODULUS:Int = MAX_VALUE_INT;