Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / common / SeedRandom.cs
@小李xl 小李xl on 14 Jul 2023 3 KB 地图编辑器生成导航网格
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using Godot;
  5.  
  6. /// <summary>
  7. /// 随机数类
  8. /// </summary>
  9. public class SeedRandom
  10. {
  11. /// <summary>
  12. /// 种子值
  13. /// </summary>
  14. public int Seed { get; }
  15. private Random _random;
  16. private static int _staticSeed = 0;
  17. public SeedRandom(int seed)
  18. {
  19. Seed = seed;
  20. _random = new Random(seed);
  21. }
  22.  
  23. public SeedRandom()
  24. {
  25. var dateTime = DateTime.Now;
  26. var num = dateTime.Year * 100000 + dateTime.Month * 100000 + dateTime.Day * 100000 + dateTime.Hour * 10000 + dateTime.Minute * 100 + dateTime.Second;
  27. num += _staticSeed;
  28. _staticSeed += 11111;
  29. Seed = num;
  30. _random = new Random(num);
  31. }
  32. /// <summary>
  33. /// 返回一个随机的double值
  34. /// </summary>
  35. public double RandomDouble()
  36. {
  37. return _random.NextDouble();
  38. }
  39. /// <summary>
  40. /// 返回随机 boolean 值
  41. /// </summary>
  42. public bool RandomBoolean()
  43. {
  44. return _random.NextSingle() >= 0.5f;
  45. }
  46. /// <summary>
  47. /// 指定概率会返回 true, probability 范围 0 - 1
  48. /// </summary>
  49. public bool RandomBoolean(float probability)
  50. {
  51. return _random.NextSingle() <= probability;
  52. }
  53.  
  54. /// <summary>
  55. /// 返回一个区间内的随机小数
  56. /// </summary>
  57. public float RandomRangeFloat(float min, float max)
  58. {
  59. if (min == max) return min;
  60. if (min > max)
  61. return _random.NextSingle() * (min - max) + max;
  62. return _random.NextSingle() * (max - min) + min;
  63. }
  64.  
  65. /// <summary>
  66. /// 返回一个区间内的随机整数
  67. /// </summary>
  68. public int RandomRangeInt(int min, int max)
  69. {
  70. if (min == max) return min;
  71. if (min > max)
  72. return Mathf.FloorToInt(_random.NextSingle() * (min - max + 1) + max);
  73. return Mathf.FloorToInt(_random.NextSingle() * (max - min + 1) + min);
  74. }
  75.  
  76. /// <summary>
  77. /// 随机返回其中一个参数
  78. /// </summary>
  79. public T RandomChoose<T>(params T[] list)
  80. {
  81. if (list.Length == 0)
  82. {
  83. return default;
  84. }
  85.  
  86. return list[RandomRangeInt(0, list.Length - 1)];
  87. }
  88.  
  89. /// <summary>
  90. /// 随机返回集合中的一个元素
  91. /// </summary>
  92. public T RandomChoose<T>(List<T> list)
  93. {
  94. if (list.Count == 0)
  95. {
  96. return default;
  97. }
  98.  
  99. return list[RandomRangeInt(0, list.Count - 1)];
  100. }
  101.  
  102. /// <summary>
  103. /// 随机返回集合中的一个元素, 并将其从集合中移除
  104. /// </summary>
  105. public T RandomChooseAndRemove<T>(List<T> list)
  106. {
  107. if (list.Count == 0)
  108. {
  109. return default;
  110. }
  111.  
  112. var index = RandomRangeInt(0, list.Count - 1);
  113. var result = list[index];
  114. list.RemoveAt(index);
  115. return result;
  116. }
  117.  
  118. /// <summary>
  119. /// 从权重列表中随机抽取下标值
  120. /// </summary>
  121. public int RandomWeight(List<int> weightList)
  122. {
  123. // 计算总权重
  124. var totalWeight = 0;
  125. foreach (var weight in weightList)
  126. {
  127. totalWeight += weight;
  128. }
  129. var randomNumber = _random.Next(totalWeight);
  130. var currentWeight = 0;
  131. for (var i = 0; i < weightList.Count; i++)
  132. {
  133. var value = weightList[i];
  134. currentWeight += value;
  135. if (randomNumber < currentWeight)
  136. {
  137. return i;
  138. }
  139. }
  140.  
  141. return RandomRangeInt(0, weightList.Count - 1);
  142. }
  143. }