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);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |