猿问

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

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

我需要在指定的间隔内生成随机数,[max;min]。

另外,随机数应该均匀地分布在区间上,而不是位于特定的点上。

目前,我正在以下列方式产生:

for(int i=0; i<6; i++){
    DWORD random = rand()%(max-min+1) + min;}

从我的测试中,随机数只产生在一个点左右。

Examplemin = 3604607;max = 7654607;

产生的随机数:

3631594

3609293

3630000

3628441

3636376

3621404


从下面得到的答案:好的,RANDMAX是32767。我在C+Windows平台上。还有其他方法来生成均匀分布的随机数吗?


神不在的星期二
浏览 596回答 3
3回答

函数式编程

警告:不要使用rand()统计,模拟,密码学或任何严肃的东西。足够做数字了看对于一个典型的匆忙中的人来说是随机的,不再是了。看见@Jefffrey的答复为更好的选择,或这个答案密码安全的随机数。一般来说,高比特比低比特显示出更好的分布,因此为了简单的目的,建议生成一个范围的随机数的方法是:((double)&nbsp;rand()&nbsp;/&nbsp;(RAND_MAX+1))&nbsp;*&nbsp;(max-min+1)&nbsp;+&nbsp;min注确保RAND_MAX+1不溢出(谢谢Demi)!该除法在间隔[0,1]中生成一个随机数;将其“拉伸”到所需的范围。只有当max-min+1接近RAND_MAX时,您才需要一个“bigRand()”函数,就像MarkRansson发布的那样。这也避免了一些切片问题,因为模块化,这会使你的数字更加恶化。内置的随机数发生器不能保证具有统计模拟所需的质量。对人来说,数字“看起来是随机的”是可以的,但是对于一个严肃的应用程序,您应该采取更好的方法-或者至少检查它的性质(均匀分布通常是好的,但是值往往是相关的,并且序列是确定性的)。Knuth有一篇关于随机数产生器的优秀论文(如果难读的话),我最近发现。LFSR要做到优秀且易于实现,考虑到它的属性对您来说是可以的。
随时随地看视频慕课网APP
我要回答