我需要创建0到2之间的随机数,因此我正在使用以下代码:
//field level
private static Random _random = new Random();
//used in a method
_random.Next(0, 2)
我的问题是:随机数序列是否会重复或停止?我需要每天重新创建(
_random = new Random();
)吗?我需要创建0到2之间的随机数,因此我正在使用以下代码:
//field level
private static Random _random = new Random();
//used in a method
_random.Next(0, 2)
_random = new Random();
)吗?你的代码已经很好了。
你不需要每天创建一个新的 Random
对象。
请注意,Random
并不是真正的随机数生成器,而是产生伪随机结果。
如果您查看文档中的备注部分,您会发现System.Random是一个伪随机生成器。
这意味着理论上序列最终会重复。实际上,这很大程度上取决于您所做的事情。例如,序列的长度足以使任何人都不会注意到它们正在重复。另一方面,它对于加密来说几乎没有用处。
编辑添加:每天重新启动不会有太大区别。要么伪随机性对您足够,要么您需要研究一种安全的方式来生成随机数。
Math.Random 返回一个32位有符号整数,如果你不重新播种,它将在第2^32个调用时重复。如果你重新播种,它将更快地重复。
随机数并不是完全随机的。如果你需要更加随机的数,你可以看一下密码学类,比如RandomNumberGenerator(抽象类),例如:RNGCryptoServiceProvider
http://msdn.microsoft.com/en-us/library/system.random(v=vs.100).aspx
假设除非您需要进行“特殊”应用程序,否则周期足够长! 我要补充的是,维基http://en.wikipedia.org/wiki/Lagged_Fibonacci_generator告诉我们,有一篇论文表明滞后斐波那契数列的24,55序列不够“随机”(在 LFG问题
下)。 Random myRand=new Random();
myRand.Next(10);
//...doing somthing with that
然后,如果您在循环中多次调用此方法,可能会得到许多重复的结果(这就是我的情况)。
我找到的解决方案是将Random myRand=new Random()
移动到成为类成员初始化语句(而不是方法的局部变量),与您所做的匹配。
之后,就不再有重复的结果了。