• c#Random微读


    官方释义:表示伪随机数生成器,这是一种能够产生满足某些随机性统计要求的数字序列的算法。

    (1)为什么叫做“伪随机数生成器”?

    Random本质上是利用一种算法,利用数学算法进行加密,从一组数中挑选出一个,但它们足够随机,可用于实际目的。(来自:微软)

    实际上我们可以通过相同的数学算法对Random的结果进行预测,所以要进行加密安全,请不要使用!

    1、Random下面的用法在数组当中添加随机数,只适用于byte和double两种类型(以下示例byte)

    1. byte[] bytes1 = new byte[100];
    2. byte[] bytes2 = new byte[100];
    3. for(int i = 0; i < bytes1.Length; i++)
    4. {
    5. Console.WriteLine(bytes1[i]);
    6. }
    7. Console.WriteLine();
    8. Random rnd1 = new Random();
    9. Random rnd2 = new Random();
    10. rnd1.NextBytes(bytes1);
    11. for(int i = 0; i < bytes1.Length; i++)
    12. {
    13. Console.WriteLine(bytes1[i]);
    14. }
    15. //输出结果
    16. /*
    17. 0
    18. 0
    19. 0
    20. 0
    21. 0
    22. 0
    23. 0
    24. 0
    25. 0
    26. 0
    27. 0
    28. 0
    29. 0
    30. 0
    31. 0
    32. 0
    33. 0
    34. 0
    35. 0
    36. 0
    37. 0
    38. 0
    39. 0
    40. 0
    41. 0
    42. 0
    43. 0
    44. 0
    45. 0
    46. 0
    47. 0
    48. 0
    49. 0
    50. 0
    51. 0
    52. 0
    53. 0
    54. 0
    55. 0
    56. 0
    57. 0
    58. 0
    59. 0
    60. 0
    61. 0
    62. 0
    63. 0
    64. 0
    65. 0
    66. 0
    67. 0
    68. 0
    69. 0
    70. 0
    71. 0
    72. 0
    73. 0
    74. 0
    75. 0
    76. 0
    77. 0
    78. 0
    79. 0
    80. 0
    81. 0
    82. 0
    83. 0
    84. 0
    85. 0
    86. 0
    87. 0
    88. 0
    89. 0
    90. 0
    91. 0
    92. 0
    93. 0
    94. 0
    95. 0
    96. 0
    97. 0
    98. 0
    99. 0
    100. 0
    101. 0
    102. 0
    103. 0
    104. 0
    105. 0
    106. 0
    107. 0
    108. 0
    109. 0
    110. 0
    111. 0
    112. 0
    113. 0
    114. 0
    115. 0
    116. 0
    117. 172
    118. 94
    119. 240
    120. 51
    121. 128
    122. 54
    123. 100
    124. 46
    125. 63
    126. 219
    127. 234
    128. 183
    129. 227
    130. 253
    131. 16
    132. 226
    133. 216
    134. 155
    135. 130
    136. 191
    137. 153
    138. 124
    139. 87
    140. 71
    141. 147
    142. 233
    143. 22
    144. 64
    145. 216
    146. 111
    147. 4
    148. 105
    149. 169
    150. 249
    151. 32
    152. 232
    153. 176
    154. 160
    155. 124
    156. 156
    157. 171
    158. 109
    159. 43
    160. 165
    161. 191
    162. 120
    163. 38
    164. 14
    165. 96
    166. 56
    167. 192
    168. 127
    169. 24
    170. 225
    171. 142
    172. 47
    173. 7
    174. 168
    175. 159
    176. 150
    177. 31
    178. 35
    179. 85
    180. 208
    181. 214
    182. 129
    183. 13
    184. 233
    185. 221
    186. 39
    187. 50
    188. 55
    189. 30
    190. 229
    191. 20
    192. 43
    193. 81
    194. 177
    195. 136
    196. 27
    197. 195
    198. 8
    199. 224
    200. 160
    201. 174
    202. 132
    203. 80
    204. 200
    205. 107
    206. 240
    207. 225
    208. 7
    209. 0
    210. 230
    211. 124
    212. 136
    213. 23
    214. 91
    215. 206
    216. 62
    217. */

    2、也可用于从string[] 中随机挑选一个,返回的是他的下标值(int)

    1. Random rnd = new Random();
    2. string[] malePetNames = { "Rufus", "Bear", "Dakota", "Fido",
    3. "Vanya", "Samuel", "Koani", "Volodya",
    4. "Prince", "Yiska" };
    5. string[] femalePetNames = { "Maggie", "Penny", "Saya", "Princess",
    6. "Abby", "Laila", "Sadie", "Olivia",
    7. "Starlight", "Talla" };
    8. // Generate random indexes for pet names.
    9. int mIndex = rnd.Next(malePetNames.Length);
    10. int fIndex = rnd.Next(femalePetNames.Length);
    11. // Display the result.
    12. Console.WriteLine("Suggested pet name of the day: ");
    13. Console.WriteLine(" For a male: {0}", malePetNames[mIndex]);
    14. Console.WriteLine(" For a female: {0}", femalePetNames[fIndex]);
    15. // The example displays output similar to the following:
    16. // Suggested pet name of the day:
    17. // For a male: Koani
    18. // For a female: Maggie
    19. (来自:微软)

    3、简单用法(比较常规的用法)

    1. Random rnd = new Random();
    2. int str=rnd.Next(1,6);//15之间随机选择一个数字
    3. int nol=rnd.Next(6);//05之间随机选择一个数字

    上述我们向您讲述了三种用途,但这不是本文的重点,我们主要在这里是要讨论的是它的注意事项:(这非常重要)

    详情参见:Random 类 (System) | Microsoft Docs

    1、使用时请不要过多的实例化Random对象,像这样(这会消耗太多的计算)

    1. Random rnd = new Random();
    2. int str=rnd.Next(1,6);//15之间随机选择一个数字
    3. Random nor = new Random();
    4. int nol=nor.Next(6);//05之间随机选择一个数字

    2、在线程当中注意保护Random

     如果应用从多个线程调用方法,则必须使用同步对象来确保一次只有一个线程可以访问随机 Random 数生成器。 如果不确保以线程安全的方式访问对象,则对返回随机数的方法的调用 Random 将返回 0。(微软)

    请确保在使用过程中不会有多个线程同时调用此方法,让他们有序调用。

    在游戏当中应用:

    有52张牌,需要抽取9张牌分发给三个人,使用随机数该如何制作?

    1. int[] Num = new int[52];
    2. Random rd = new Random();
    3. int num;
    4. bool flag;
    5. for (int i = 0; i < 52; i++)
    6. {
    7. do
    8. {
    9. flag = true;
    10. num = rd.Next(53);
    11. for (int j = 0; j < i; j++)
    12. {
    13. if (num == Num[j])
    14. {
    15. flag=false;
    16. break;
    17. }
    18. }
    19. }
    20. while (!flag);
    21. {
    22. Num[i] = num;
    23. }
    24. }
    25. //选择前9
    26. for (int i = 0; i < 9; i++)
    27. {
    28. Console.WriteLine(Num[i]);
    29. }

    -------------------------------------以下是更新内容-------------------------------------

    c#的随机数种子

    ok,先来简单的说下为什么要用随机数种子

    主要的原因是希望我们随机出来的数字“尽可能的”不重复、

    为什么是尽可能?

    这是因为Random本质上是一种数字序列的算法,所以避免不了出现重复相同。

    但为了尽量随机,让他不一致,因此使用随机数种子

    random首先要考虑线程问题,因此需要使用lock锁

    但如果你在unity中使用,也建议你为了线程安全使用,这并不强制,这需要您注意处理伪线程。

    为了对新手友好,代码如下:

    1. Object game = new Object();//线程锁
    2. Random random = new Random((int)DateTime.Now.Ticks);//随机数
    3. //这里面是获取你当前的时间信息作为种子来进行随机的,要求是一个整数作为种子
    4. 注(1
    5. List<int> ints = new List<int>();//将随机出来的数字保存到集合
    6. lock (game) //加线程锁,保护线程
    7. {
    8. for (int i = 0; i < 50; i++)//随机50个对象
    9. {
    10. int ran = random.Next(0, 100);//指定范围0——100
    11. if (!ints.Contains(ran)) //如果在集合中没有相同的数字添加到集合中
    12. {
    13. ints.Add(ran);
    14. }
    15. }
    16. }
    17. for (int i = 0; i < ints.Count; i++) //输出集合中的数字,如果你要使用的话,也可以选择前几个数字
    18. {
    19. Console.WriteLine(ints[i]);
    20. }
    21. Console.ReadKey();

    注(1):

    这里使用时间是为了让他足够随机,因为我们的时间是在不断变化的,这样确保了种子的随机性,但random选取种子会有15ms的一个随机序列生成,时间很短,这也就会导致会有一定重复的可能性

    为了剔除这种随机出来相同的数字,我们将出来不同的数字添加到集合中,来以此确保它不会重复。

  • 相关阅读:
    vue3在router中使用store报错解决方案
    QGraphicsView自定义游标【解决修改光标样式不起作用】
    OpenCV----YOLOv5目标检测模型推理 (兼容YOLACT)
    深入注册表监控
    互联网医疗产品如何最大程度上避免和制约号贩子占号行为?
    【UCIe】UCIe 相关术语名词缩写释义
    【Nginx32】Nginx学习:随机索引、真实IP处理与来源处理模块
    Latex如何隐藏图片
    Glide系列(四) — Glide缓存流程分析
    神经网络每次输出不一样,神经网络输出值相同
  • 原文地址:https://blog.csdn.net/qq_46043095/article/details/126516928