从范围生成随机整数

从范围生成随机整数

我需要一个函数,它将在给定的范围内生成一个随机整数(包括边框值)。我没有不合理的质量/随机性要求,我有四个要求:

  • 我需要它快点。我的项目需要生成数百万(有时甚至数千万)随机数,而我当前的生成器功能已经被证明是一个瓶颈。
  • 我需要它是合理的统一(使用兰特()是完全好的)。
  • 最小-最大值范围可以是从<32727,1>到<-32727,32727>的任何范围.
  • 它必须是可播种的。

我现在有以下C+代码:

output = min + (rand() * (int)(max - min) / RAND_MAX)

问题是,只有当rand()=rand_max(对于Visualc+是1/32727)时才返回它不是真正的一致-max。对于诸如<-1,1>这样的小范围来说,这是一个主要问题,因为最后一个值几乎永远不会返回。

于是我抓起笔和纸,提出了以下公式(它建立在(Int)(n+0.5)整数四舍五入技巧的基础上):

https://img.mukewang.com/5d0f40370001a48302710072.jpg

但它仍然没有给我统一的分布。重复运行的10000个样本给我的比率为37:50:13的数值-1,0。1.

你能推荐更好的配方吗?(甚至整个伪随机数产生函数)


慕标琳琳
浏览 479回答 3
3回答

绝地无双

一个快速的,略好于您的,但仍然不完全统一的分布式解决方案是output&nbsp;=&nbsp;min&nbsp;+&nbsp;(rand()&nbsp;%&nbsp;static_cast<int>(max&nbsp;-&nbsp;min&nbsp;+&nbsp;1))除非范围的大小是2次方,这种方法产生偏非均匀分布数字不管质量rand()..为了全面测试这种方法的质量,请读这个.
打开App,查看更多内容
随时随地看视频慕课网APP