为了账号安全,请及时绑定邮箱和手机立即绑定

在整个范围内一致生成随机数

在整个范围内一致生成随机数

C++
神不在的星期二 2019-06-25 17:18:13
在整个范围内一致生成随机数我需要在指定的间隔内生成随机数,[max;min]。另外,随机数应该均匀地分布在区间上,而不是位于特定的点上。目前,我正在以下列方式产生:for(int i=0; i<6; i++){     DWORD random = rand()%(max-min+1) + min;}从我的测试中,随机数只产生在一个点左右。Examplemin = 3604607;max = 7654607;产生的随机数:363159436092933630000362844136363763621404从下面得到的答案:好的,RANDMAX是32767。我在C+Windows平台上。还有其他方法来生成均匀分布的随机数吗?
查看完整描述

3 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

警告:不要使用rand()统计,模拟,密码学或任何严肃的东西。

足够做数字了对于一个典型的匆忙中的人来说是随机的,不再是了。

看见@Jefffrey的答复为更好的选择,或这个答案密码安全的随机数。


一般来说,高比特比低比特显示出更好的分布,因此为了简单的目的,建议生成一个范围的随机数的方法是:

((double) rand() / (RAND_MAX+1)) * (max-min+1) + min

确保RAND_MAX+1不溢出(谢谢Demi)!

该除法在间隔[0,1]中生成一个随机数;将其“拉伸”到所需的范围。只有当max-min+1接近RAND_MAX时,您才需要一个“bigRand()”函数,就像MarkRansson发布的那样。

这也避免了一些切片问题,因为模块化,这会使你的数字更加恶化。


内置的随机数发生器不能保证具有统计模拟所需的质量。对人来说,数字“看起来是随机的”是可以的,但是对于一个严肃的应用程序,您应该采取更好的方法-或者至少检查它的性质(均匀分布通常是好的,但是值往往是相关的,并且序列是确定性的)。Knuth有一篇关于随机数产生器的优秀论文(如果难读的话),我最近发现。LFSR要做到优秀且易于实现,考虑到它的属性对您来说是可以的。


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 595 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信