从范围生成随机整数
我需要一个函数,它将在给定的范围内生成一个随机整数(包括边框值)。我没有不合理的质量/随机性要求,我有四个要求:
- 我需要它快点。我的项目需要生成数百万(有时甚至数千万)随机数,而我当前的生成器功能已经被证明是一个瓶颈。
- 我需要它是合理的统一(使用兰特()是完全好的)。
- 最小-最大值范围可以是从<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)整数四舍五入技巧的基础上):
但它仍然没有给我统一的分布。重复运行的10000个样本给我的比率为37:50:13的数值-1,0。1.
你能推荐更好的配方吗?(甚至整个伪随机数产生函数)