系统有多随机?随机rnd = new System.Random();

本文关键字:随机 Random System new rnd 系统 | 更新日期: 2023-09-27 17:54:30

我有一些运行的代码。在循环内执行:

System.Random rnd = new System.Random();

如果在运行呼叫之间几乎没有时间延迟,我可以期望号码是随机的吗?

系统有多随机?随机rnd = new System.Random();

您不应该每次想要一个随机数时都创建一个新的Random实例。您应该创建它一次,然后使用Next…方法。

如果你这样做,它将是随机的,无论时间延迟。

来自文档:

伪随机数用等概率从一个有限的集合数字。选择的数字则不是完全随机,因为是确定的数学算法是用来选择它们,但它们已经足够了为了实际目的而随机。的当前实现的随机类基于修改后的版本唐纳德·e·高德纳的减法随机数生成算法。为更多信息,请参见d.e.k nuth。《计算机程序设计的艺术》卷2:半数值算法"。艾迪生-韦斯利,雷丁,马萨诸塞州,第二版,1981 .

未考虑生成两个随机数之间的延迟。当然,这指的是在同一个实例上调用Random.Next,而不是像代码中那样每次都创建一个新的Random实例(这是错误的):

这个问题可以避免而是创建一个随机对象

为了提高性能,创建一个随机对象生成许多随机数字随时间变化,而不是重复创造一个新的随机对象生成一个随机数。

如果您需要生成加密强度的随机性:

生成一个加密安全的适合创建a的随机数随机密码,例如使用a派生的类System.Security.Cryptography.RandomNumberGenerator如System.Security.Cryptography.RNGCryptoServiceProvider .

不,你几乎肯定会得到两次相同的数字。你想在整个序列中使用Random的单个实例…只要你在一个线程中做所有的事情。

这是不幸的,Random有这个问题不是线程安全的-所以有一个单一的静态变量初始化一次的简单方法不工作:(

有几种方法可以解决这个问题,包括为每个线程创建一个实例。

我有一篇更详细的文章,你可能会觉得有帮助。

为什么不把这行移到循环之外,只在循环内部调用Next()方法呢?

不,因为调用new System.Random();没有参数将使用系统时钟作为种子,因此可能在循环中得到相同的随机数。

你应该在循环外创建一个新的System.Random()对象,并在循环内获取下一个随机数。

rnd.Next();

这不会是随机的,因为你将使用相同的种子。

只在循环外出现这一行,并且在每次迭代中使用相同的rnd实例,调用其Next方法。

一些基本的解释:计算机不能生成"实"随机数。诀窍是取一些唯一的种子,通常是大整数,然后使用特殊的算法将种子变成所需范围内的数字。同样的种子每次调用都会产生同样的"随机"数字序列。

据我所知,c#使用的默认种子是1970年1月1日以来经过的毫秒数

需要随机数还是伪随机数?那system . security . cryptographic . randomnumbergenerator呢?

http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider.aspx

是的,它会给出随机值,我认为它与调用之间是否存在延迟没有任何关系。在循环外声明并初始化随机变量