forked from LeenkxTeam/LNXSDK
83 lines
1.8 KiB
Haxe
83 lines
1.8 KiB
Haxe
|
package kha.math;
|
||
|
|
||
|
// Small Fast Counter 32 (sfc32) PRNG implementation
|
||
|
// sfc32 is public domain: http://pracrand.sourceforge.net/license.txt
|
||
|
// Implementation derived from: https://github.com/bryc/code/blob/master/jshash/PRNGs.md
|
||
|
// which is also public domain
|
||
|
|
||
|
/**
|
||
|
Random number generator
|
||
|
|
||
|
Please use this one instead of the native Haxe one to
|
||
|
keep consistency between different platforms.
|
||
|
**/
|
||
|
class Random {
|
||
|
var a: Int;
|
||
|
var b: Int;
|
||
|
var c: Int;
|
||
|
var d: Int;
|
||
|
|
||
|
public function new(seed: Int): Void {
|
||
|
d = seed;
|
||
|
a = 0x36aef51a;
|
||
|
b = 0x21d4b3eb;
|
||
|
c = 0xf2517abf;
|
||
|
// Immediately skip a few possibly poor results the easy way
|
||
|
for (i in 0...15) {
|
||
|
this.Get();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function Get(): Int {
|
||
|
var t = (a + b | 0) + d | 0;
|
||
|
d = d + 1 | 0;
|
||
|
a = b ^ b >>> 9;
|
||
|
b = c + (c << 3) | 0;
|
||
|
c = c << 21 | c >>> 11;
|
||
|
c = c + t | 0;
|
||
|
return t & 0x7fffffff;
|
||
|
}
|
||
|
|
||
|
public function GetFloat(): Float {
|
||
|
return Get() / 0x7fffffff;
|
||
|
}
|
||
|
|
||
|
public function GetUpTo(max: Int): Int {
|
||
|
return Get() % (max + 1);
|
||
|
}
|
||
|
|
||
|
public function GetIn(min: Int, max: Int): Int {
|
||
|
return Get() % (max + 1 - min) + min;
|
||
|
}
|
||
|
|
||
|
public function GetFloatIn(min: Float, max: Float): Float {
|
||
|
return min + GetFloat() * (max - min);
|
||
|
}
|
||
|
|
||
|
public static var Default: Random;
|
||
|
|
||
|
public static function init(seed: Int): Void {
|
||
|
Default = new Random(seed);
|
||
|
}
|
||
|
|
||
|
public static function get(): Int {
|
||
|
return Default.Get();
|
||
|
}
|
||
|
|
||
|
public static function getFloat(): Float {
|
||
|
return Default.GetFloat();
|
||
|
}
|
||
|
|
||
|
public static function getUpTo(max: Int): Int {
|
||
|
return Default.GetUpTo(max);
|
||
|
}
|
||
|
|
||
|
public static function getIn(min: Int, max: Int): Int {
|
||
|
return Default.GetIn(min, max);
|
||
|
}
|
||
|
|
||
|
public static function getFloatIn(min: Float, max: Float): Float {
|
||
|
return min + Default.GetFloat() * (max - min);
|
||
|
}
|
||
|
}
|