我需要创建0到2之间的随机数,所以我正在使用:
//field level
private static Random _random = new Random();
//used in a method
_random.Next(0, 2)
我的问题是:序列是否会重复/停止随机?我应该每天重新创建(_random = new Random();
)吗?
答案 0 :(得分:7)
你的代码很好。
您不需要每天创建一个新的Random
对象。
请注意,Random
并非真正随机,而是产生伪随机结果。
答案 1 :(得分:4)
如果您查看“备注”部分in the documentation,您会发现System.Random是一个伪随机生成器。
这意味着理论上序列最终会重复。在实践中,它在很大程度上取决于你正在做什么,这有多重要。例如,序列的长度使得人们不会注意到它们重复。另一方面,它对密码学来说毫无用处。
编辑添加:每天重新启动不会产生太大影响。伪随机性对您来说已足够,或者您需要查看以加密方式生成随机数的安全方法。
答案 2 :(得分:2)
Math.Random返回一个32位有符号整数,如果你不重新调用,它将在2 ^ 32'调用时重复。如果你重新研究它会很快重复。
答案 3 :(得分:2)
随机不是 随机。如果您需要“更多”随机,您应该查看加密类,例如RandomNumberGenerator(摘要),例如:RNGCryptoServiceProvider
答案 4 :(得分:2)
如果你读到这个,你会看到Random(当前)基于the subtractive lagged Fibonacci generator of (24, 55)
,它应该保证周期至少为2 ^ 55。但如果你看一下页面的末尾,有人指出了一个可能的错误(2010年10月ytosa
的评论)
http://msdn.microsoft.com/en-us/library/system.random(v=vs.100).aspx
让我们说这段时间足够长,除非你需要做“特殊”的申请!
我将补充说,维基http://en.wikipedia.org/wiki/Lagged_Fibonacci_generator告诉我们,有一篇文章显示24,55序列的滞后斐波那契不是“随机”(Problems with LFG
下)
答案 5 :(得分:0)
如果目的是生成加密安全的随机数,您应该使用更好的PRNG。如果您只是想偶尔使用随机数并且真正的随机性并不重要(我想这给出了输出值范围)那么您的代码很可能就好了。
答案 6 :(得分:0)
值得一提的是(根据我的经验列出)如果您在声明时有方法:
Random myRand=new Random();
myRand.Next(10);
//...doing somthing with that
然后,如果你多次调用这个方法(在一个循环中),你可能会得到很多重复的结果。 (发生在我身上的事情)。
我找到的解决方案是将Random myRand=new Random()
移动为类成员启动声明(而不是方法的局部变量),匹配如下你做到了。
之后,不再有重复的结果