2011-05-04 68 views

回答

5

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

提供你这样做,它会随机的,无论时间延迟。

+0

谢谢。但是如果我在接下来的行中使用下一个,然后再使用另一个,会怎样它仍然是随机的吗? – 2011-05-04 10:24:55

+1

@ Dave-Heart。是。 – 2011-05-04 10:31:14

1

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

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

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

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

2

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

0

是的,它会给随机值,我不认为它有任何事情要做,无论是否存在呼叫之间的延迟。声明并初始化循环外的随机变量。

3

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

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

有几个方法来解决这包括创建每个线程的实例

我有一个article它进入了很多更详细的,这对您有帮助

2

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

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

rnd.Next(); 
5

documentation

伪随机数被从有限的 号码选择了与 相等的概率。所选择的数字不是 完全随机的,因为使用数学算法确定 选择它们,但是它们足够实际用于随机选择 。随机数 类的当前实现基于Donald E.Knuth的减法 随机数生成器算法的修改版本 。有关 的更多信息,请参见D. E. Knuth。 “计算机编程艺术, 第2卷:研究数学算法”。 Addison-Wesley出版社,阅读,MA,第二 版,1981年

产生两个随机数不进入帐户之间的延迟。当然,这是指在同一实例调用Random.Next而不是每次都在你的代码(这是错误的)创建一个新的Random实例:

可避免此问题,通过 创建一个随机对象,而 比多个。

为了提高性能,创建一个 Random对象随着时间的推移产生许多随机 数字,而不是反复 创建一个新的随机 对象,生成一个随机数。

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

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

相关问题