Random.Next会不会随机停止?

时间:2011-02-25 13:13:55

标签: c# .net

我需要创建0到2之间的随机数,所以我正在使用:

//field level
private static Random _random = new Random();

//used in a method
_random.Next(0, 2)

我的问题是:序列是否会重复/停止随机?我应该每天重新创建(_random = new Random();)吗?

7 个答案:

答案 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()移动为成员启动声明(而不是方法的局部变量),匹配如下你做到了。

之后,不再有重复的结果