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

时间:2011-05-04 10:18:34

标签: c# random

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

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

如果在通话之间几乎没有时间延迟,我可以期待这个号码是随机的吗?

8 个答案:

答案 0 :(得分:5)

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

如果你做到这一点,无论时间延迟,它都是随机的。

答案 1 :(得分:5)

来自documentation

  

选择伪随机数   来自有限集合的等概率   数字。所选的数字不是   完全随机,因为一定的   数学算法用于   选择它们,但它们足够了   随机用于实际目的。该   当前实现的随机   class基于修改后的版本   唐纳德E.克努特的减法   随机数发生器算法。对于   更多信息,请参阅D. E. Knuth。   “计算机编程的艺术,   第2卷:半数值算法“。   Addison-Wesley,Reading,MA,第二名   版,1981。

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

  

这个问题可以避免   相反,创建一个Random对象   而不是多个。

     

要提高效果,请创建一个   随机对象生成许多随机   数字随着时间的推移,而不是   反复创建一个新的随机   对象生成一个随机数。

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

  

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

答案 2 :(得分:3)

不,你几乎肯定会得到两次相同的数字。您希望在整个序列中使用Random的单个实例...只要您在一个线程中执行所有操作。

很遗憾Random有这个问题不是线程安全的 - 所以将一个静态变量初始化一次的简单方法不起作用:(

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

我有一个article,它会提供更多详细信息,您可能会觉得有用。

答案 3 :(得分:2)

为什么不在循环之外移动该行,只调用循环内的Next()方法?

答案 4 :(得分:2)

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

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

rnd.Next();

答案 5 :(得分:1)

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

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

一些基本解释:计算机无法生成“真实”的随机数。诀窍是采用一些独特的种子,通常是大整数,而不是使用特殊的算法,使种子成为所需范围内的数字。每次调用时,相同的种子都会产生相同的“随机”数字序列。

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

答案 6 :(得分:1)

您需要随机或伪随机数吗? 那么System.Security.Cryptography.RandomNumberGenerator呢?

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

答案 7 :(得分:0)

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