首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有效生成随机数

有效生成随机数
EN

Stack Overflow用户
提问于 2011-11-26 14:01:23
回答 5查看 4.5K关注 0票数 1

如何有效地生成随机数?

每当一个随机数程序启动时,它就开始吐出和以前相同的数字。(我猜是因为随机数产生的准性质)

有没有一种方法,使random#的产生变得不确定?除了生成熵之外,引导后生成的数字与上一次的顺序不同。(随机随机而非准随机)

另外,假设这类生成的范围是(m,n),使得n-m = x,那么在生成x-1其他数字之后,下一次是否有一个数字说'p‘出现的可能性。但下一批这样的x数将与上一次的序列不一样。示例:

范围: 1,5.世代: 2,4,5,1,3 (1) 4,2,3,1,5 (2).相同数。

我的心不在焉地写道:

代码语言:javascript
复制
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代码。为什么会这样呢?

你的答案可以是语言不可知论/算法/分析。提前谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-26 15:46:02

很少有“随机”数字发生器实际上是随机的。几乎所有的都是伪随机,使用相同的种子值启动时遵循可预测的序列。许多伪随机数发生器 (PRNG)从初始调用的日期和时间获得它们的种子。另一些人则从操作系统提供的随机数据来源获得种子,这些数据通常是从外部来源(例如鼠标运动、键盘活动)生成的。

给一个好的随机数发生器种种子的正确方法是不播种它。每个好的生成器都有一个默认的机制来提供种子,而且它通常比任何你能想到的都要好得多。创建生成器的唯一真正原因是,如果您实际上希望使用相同的随机数序列(例如,当您试图重复一个需要随机性的过程时)。

有关http://msdn.microsoft.com/en-us/library/system.random.aspx随机类的详细信息,请参阅C#,但基本上,它使用了一个非常著名和受尊敬的算法,并以日期和时间为种子。

要回答您的关键问题,只需使用rand.Next(min, max+1),总是会得到minmax包含的随机数列。每次使用相同的种子时,序列都是一样的。但是rand = new Random()将使用当前时间,只要您的程序在调用时有一定的时间间隔,它们就会有所不同。

票数 2
EN

Stack Overflow用户

发布于 2011-11-26 14:06:33

“种子”随机数生成器,获取从午夜开始的秒数,然后传入:

代码语言:javascript
复制
Random rand = new Random(secs);

这仍然不会产生完全随机的数字,但应该为您的目的服务。

票数 1
EN

Stack Overflow用户

发布于 2011-11-26 16:15:31

一遍又一遍地产生相同的序列通常是一个特性,而不是一个bug,只要你控制它。产生可重复的序列使调试更容易。如果你真的想要一个不可复制的随机序列,你可以找一个安全的随机数生成器,以此作为设计目标。您已经标记了您的问题C#,但是由于http://docs.oracle.com/javase/1.4.2/docs/api/java/security/SecureRandom.htmlhttp://docs.oracle.com/javase/1.4.2/docs/api/java/security/SecureRandom.html,而windows有http://en.wikipedia.org/wiki/CryptGenRandom,所以您可以在C#中找到类似的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8278907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档