using UnityEngine; using System.Runtime.InteropServices; using Random = UnityEngine.Random; public class Tests : MonoBehaviour { System.Text.StringBuilder sb = new System.Text.StringBuilder(); // Start is called before the first frame update void Start() { UnityEngine.Random.InitState(1234); XORShift128.InitSeed(1234); // Print some ranged integers // 0 to max IntegerTests(0, int.MaxValue); // 0 to min IntegerTests(0, int.MinValue); // Min to max IntegerTests(int.MinValue, int.MaxValue); // Max to min IntegerTests(int.MaxValue, int.MinValue); // Min to min (error) IntegerTests(int.MinValue, int.MinValue); // Print some floating points for (int i = 0; i < 5; i++) AppendTestFloat(Random.value, XORShift128.NextFloat()); // Print some ranged floating points // 0 to 100 FloatingPointTests(0f, 100f); // 0 to 100000 FloatingPointTests(0f, 100000f); // 0 to max (not accurate) FloatingPointTests(0f, float.MaxValue); // 0 to min (not accurate) FloatingPointTests(0f, float.MinValue); // Min to max FloatingPointTests(float.MinValue, float.MaxValue); // Max to min FloatingPointTests(float.MaxValue, float.MinValue); // Min to min FloatingPointTests(float.MinValue, float.MinValue); Debug.Log(sb.ToString()); } void IntegerTests(int min, int max) { sb.AppendLine("--- " + min + " to " + max + " ---"); for (int i = 0; i < 5; i++) { int ur = UnityEngine.Random.Range(min, max); int xr = XORShift128.NextIntRange(min, max); AppendTestInt(ur, xr); } } void FloatingPointTests(float min, float max) { sb.AppendLine("--- " + min + " to " + max + " ---"); for (int i = 0; i < 5; i++) { float ur = UnityEngine.Random.Range(min, max); float xr = XORShift128.NextFloatRange(min, max); AppendTestFloat(ur, xr); } } void AppendTest(string a, string b) { var state = (RandomStateWrapper)UnityEngine.Random.state; sb.AppendLine(state.v3.ToString().PadRight(15) + XORShift128.w.ToString().PadRight(15) + a.PadRight(15) + b.PadRight(15)); } void AppendTestInt(int a, int b) { AppendTest(a.ToString(), b.ToString()); } void AppendTestFloat(float a, float b) { AppendTest(a.ToString(), b.ToString()); } } [StructLayout(LayoutKind.Explicit)] public struct RandomStateWrapper { [FieldOffset(0)] public Random.State state; [FieldOffset(0)] public uint v0; [FieldOffset(4)] public uint v1; [FieldOffset(8)] public uint v2; [FieldOffset(12)] public uint v3; public static implicit operator RandomStateWrapper(Random.State aState) { return new RandomStateWrapper { state = aState }; } public static implicit operator Random.State(RandomStateWrapper aState) { return aState.state; } public override string ToString() { return v0 + ", " + v1 + ", " + v2 + ", " + v3; } }