如何有效地生成随机数?
每当一个随机数程序启动时,它就开始吐出和以前相同的数字。(我猜是因为随机数产生的准性质)
有没有一种方法,使random#的产生变得不确定?除了生成熵之外,引导后生成的数字与上一次的顺序不同。(随机随机而非准随机)
另外,假设这类生成的范围是(m,n),使得n-m = x,那么在生成x-1其他数字之后,下一次是否有一个数字说'p‘出现的可能性。但下一批这样的x数将与上一次的序列不一样。示例:
范围: 1,5.世代: 2,4,5,1,3 (1) 4,2,3,1,5 (2).相同数。
我的心不在焉地写道:
int num1 = (rand.Next(1, 440) *31* (int)DateTime.Now.Ticks *59* (DateTime.Now.Second * 100) % 439) + 1;
int num2 = (rand.Next(1, 440) *31* (int)DateTime.Now.Ticks *59* (DateTime.Now.Second * 100) % 439) + 1;这里的范围是(1,440)。但它仍然产生超出界限和零的数字,而且它的频率也没有那么大。这是C#.NET代码。为什么会这样呢?
你的答案可以是语言不可知论/算法/分析。提前谢谢。
发布于 2011-11-26 15:46:02
很少有“随机”数字发生器实际上是随机的。几乎所有的都是伪随机,使用相同的种子值启动时遵循可预测的序列。许多伪随机数发生器 (PRNG)从初始调用的日期和时间获得它们的种子。另一些人则从操作系统提供的随机数据来源获得种子,这些数据通常是从外部来源(例如鼠标运动、键盘活动)生成的。
给一个好的随机数发生器种种子的正确方法是不播种它。每个好的生成器都有一个默认的机制来提供种子,而且它通常比任何你能想到的都要好得多。创建生成器的唯一真正原因是,如果您实际上希望使用相同的随机数序列(例如,当您试图重复一个需要随机性的过程时)。
有关http://msdn.microsoft.com/en-us/library/system.random.aspx随机类的详细信息,请参阅C#,但基本上,它使用了一个非常著名和受尊敬的算法,并以日期和时间为种子。
要回答您的关键问题,只需使用rand.Next(min, max+1),总是会得到min和max包含的随机数列。每次使用相同的种子时,序列都是一样的。但是rand = new Random()将使用当前时间,只要您的程序在调用时有一定的时间间隔,它们就会有所不同。
发布于 2011-11-26 14:06:33
“种子”随机数生成器,获取从午夜开始的秒数,然后传入:
Random rand = new Random(secs);这仍然不会产生完全随机的数字,但应该为您的目的服务。
发布于 2011-11-26 16:15:31
一遍又一遍地产生相同的序列通常是一个特性,而不是一个bug,只要你控制它。产生可重复的序列使调试更容易。如果你真的想要一个不可复制的随机序列,你可以找一个安全的随机数生成器,以此作为设计目标。您已经标记了您的问题C#,但是由于http://docs.oracle.com/javase/1.4.2/docs/api/java/security/SecureRandom.html有http://docs.oracle.com/javase/1.4.2/docs/api/java/security/SecureRandom.html,而windows有http://en.wikipedia.org/wiki/CryptGenRandom,所以您可以在C#中找到类似的内容。
https://stackoverflow.com/questions/8278907
复制相似问题