Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
Random.cs
浏览该文件的文档.
1using System.Diagnostics;
2
3namespace Engine {
4 public class Random {
5 static int m_counter = (int)(Stopwatch.GetTimestamp() + DateTime.Now.Ticks);
6
7 uint m_s0;
8
9 uint m_s1;
10
11 public ulong State {
12 get => m_s0 + ((ulong)m_s1 << 32);
13 set {
14 m_s0 = (uint)value;
15 m_s1 = (uint)(value >> 32);
16 }
17 }
18
19 public Random() {
20 Seed();
21 }
22
23 public Random(int seed) {
24 Seed(seed);
25 }
26
27 public void Seed() {
28 Seed(m_counter++);
29 }
30
31 public void Seed(int seed) {
32 m_s0 = (uint)(seed + 42817);
33 m_s1 = (uint)(seed + 324508639);
34 }
35
36 public int Sign() => (int)((UInt() & 1) * 2 - 1);
37
38 public bool Bool() => (UInt() & 1) != 0;
39
40 public bool Bool(float probability) => Int() / 2.147484E+09f < probability;
41
42 public uint UInt() {
43 uint s = m_s0;
44 uint s2 = m_s1;
45 s2 ^= s;
46 m_s0 = RotateLeft(s, 26) ^ s2 ^ (s2 << 9);
47 m_s1 = RotateLeft(s2, 13);
48 return RotateLeft(s * 2654435771u, 5) * 5;
49 }
50
51 public int Int() => (int)(UInt() & 0x7FFFFFFF);
52
53 public int Int(int bound) => (int)(Int() * (long)bound / 2147483648u);
54
55 public int Int(int min, int max) => (int)(min + Int() * (long)(max - min + 1) / 2147483648u);
56
57 public float Float() => Int() / 2.147484E+09f;
58
59 public float Float(float min, float max) => min + Float() * (max - min);
60
61 public float NormalFloat(float mean, float stddev) {
62 float num = Float();
63 if (num < 0.5) {
64 float num2 = MathUtils.Sqrt(-2f * MathUtils.Log(num));
65 float num3 = 0.32223243f + num2 * (1f + num2 * (0.3422421f + num2 * (0.020423122f + num2 * 4.536422E-05f)));
66 float num4 = 0.09934846f + num2 * (0.58858156f + num2 * (0.5311035f + num2 * (0.10353775f + num2 * 0.00385607f)));
67 return mean + stddev * (num3 / num4 - num2);
68 }
69 float num5 = MathUtils.Sqrt(-2f * MathUtils.Log(1f - num));
70 float num6 = 0.32223243f + num5 * (1f + num5 * (0.3422421f + num5 * (0.020423122f + num5 * 4.536422E-05f)));
71 float num7 = 0.09934846f + num5 * (0.58858156f + num5 * (0.5311035f + num5 * (0.10353775f + num5 * 0.00385607f)));
72 return mean - stddev * (num6 / num7 - num5);
73 }
74
75 public Vector2 Vector2() {
76 float num;
77 float num2;
78 float num3;
79 float num4;
80 float num5;
81 do {
82 num = 2f * Float() - 1f;
83 num2 = 2f * Float() - 1f;
84 num3 = num * num;
85 num4 = num2 * num2;
86 num5 = num3 + num4;
87 }
88 while (!(num5 < 1f)
89 || !(num5 > 0f));
90 float num6 = 1f / num5;
91 return new Vector2((num3 - num4) * num6, 2f * num * num2 * num6);
92 }
93
94 public Vector2 Vector2(float length) => Engine.Vector2.Normalize(Vector2()) * length;
95
96 public Vector2 Vector2(float minLength, float maxLength) => Engine.Vector2.Normalize(Vector2()) * Float(minLength, maxLength);
97
98 public Vector3 Vector3() {
99 float num;
100 float num2;
101 float num3;
102 do {
103 num = 2f * Float() - 1f;
104 num2 = 2f * Float() - 1f;
105 num3 = num * num + num2 * num2;
106 }
107 while (!(num3 < 1f)
108 || !(num3 > 0f));
109 float num4 = MathUtils.Sqrt(1f - num3);
110 return new Vector3(2f * num * num4, 2f * num2 * num4, 1f - 2f * num3);
111 }
112
113 public Vector3 Vector3(float length) => Engine.Vector3.Normalize(Vector3()) * length;
114
115 public Vector3 Vector3(float minLength, float maxLength) => Engine.Vector3.Normalize(Vector3()) * Float(minLength, maxLength);
116
117 static uint RotateLeft(uint x, int k) => (x << k) | (x >> (32 - k));
118 }
119}
static float Sqrt(float x)
static float Log(float x)
static int m_counter
float NormalFloat(float mean, float stddev)
static uint RotateLeft(uint x, int k)
int Int(int bound)
float Float(float min, float max)
Vector2 Vector2(float length)
Random(int seed)
Vector3 Vector3(float minLength, float maxLength)
void Seed(int seed)
Vector2 Vector2(float minLength, float maxLength)
Vector2 Vector2()
Vector3 Vector3()
int Int(int min, int max)
bool Bool(float probability)
Vector3 Vector3(float length)
static Vector2 Normalize(Vector2 v)
static Vector3 Normalize(Vector3 v)