我有一些运行的代码。在循环内部我执行:
System.Random rnd = new System.Random();
如果在通话之间几乎没有时间延迟,我可以期待这个号码是随机的吗?
答案 0 :(得分:5)
每次需要随机数时,都不应创建新的Random实例。您应该创建一次,然后使用Next ...方法。
如果你做到这一点,无论时间延迟,它都是随机的。
答案 1 :(得分:5)
选择伪随机数 来自有限集合的等概率 数字。所选的数字不是 完全随机,因为一定的 数学算法用于 选择它们,但它们足够了 随机用于实际目的。该 当前实现的随机 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)
是的,它会给出随机值,我不认为它与呼叫之间是否存在延迟有任何关系。在循环外声明并初始化随机变量。