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