繁体   English   中英

如何使用rand函数在特定范围内生成数字?

[英]How to use the rand function to make numbers in a specific range?

我想在特定范围内制作随机数,例如“选择18到35之间的随机数”? 我怎么能用rand()函数做到这一点?

根据您使用的语言,内置随机数生成器可能已具备此功能 - 进行更多研究。

假设您随机数生成器始终返回某个给定范围内的数字。 仅仅为了争论,我们可以说范围是0..65536,但是你想要在你的例子中Low..High,18..35范围内的随机数。

做错的方法是这样的:

 r = (rand() % (High - Low + 1)) + Low

rand()返回0..65536范围内的数字。 除以(高 - 低+ 1)后的余数,在本例中为(35 - 18 + 1 = 18)。 结果是0..17之间的数字。 为此你添加低(18),将结果r移动到18..35的范围内。 您正在寻找的范围。

在用于获得余数的除数不是rand()函数返回的上限的偶数倍的情况下,以这种方式生成的数字不具有均匀分布。 请参阅Fischer Yates算法 - 模数偏差 要消除此偏差,您需要计算小于rand()返回的最大数字,但均匀地除以(High - Low + 1)。 在你的情况下是3640 * 18 = 65520.使用它作为rand()返回的数字的高范围过滤器,如下所示:

  do forever {
     r = rand()
     if r <= 65520 then {
         r = (r % (High - Low + 1)) + Low
         break
         }
     } 

现在,您生成的随机数应具有与rand()相同的分布特征。

如果这是用C语言编写的,那么你就非常接近了。 编译此代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int i;
    for (i = 0; i < 1000000; i++) {
        printf("%d\n", rand()%(35-18+1)+18);
    }
}

在管道中运行它会产生以下输出:

chris@zack:~$ gcc -o test test.c
chris@zack:~$ ./test | sort | uniq -c
  55470 18
  55334 19
  55663 20
  55463 21
  55818 22
  55564 23
  55322 24
  55886 25
  55947 26
  55554 27
  55342 28
  55526 29
  55719 30
  55435 31
  55669 32
  55818 33
  55205 34
  55265 35

关键是你忘了添加1 - fencepost错误

您可以将其概括为一个函数:

int random_between(int min, int max) {
    return rand() % (max - min + 1) + min;
}
  1. 你想要整数吗?
  2. 你想要统一分发吗?
  3. 您想要将18和35都包含为可能的值吗?
  4. 你更喜欢用哪种语言?

一般来说,如果rand()在[0.0 ... 1.0)中返回一个浮点值(也就是说,你可能会得到任意接近1.0但实际上不是1的值)那么你会想要类似的东西

hi = 36
lo = 18
res = int( (hi-lo)*rand() + lo ) # returns random values in 18..35

请注意,这实际上永远不会返回hi值 - 因此我将其增加1(即,您将获得18到35之间的所有值,但从不36)。

希望有所帮助。

假设rand()给出一个0到1.0之间的数字

然后使用rand()*(35 - 18)+ 18来获得18到35之间的随机数。

编辑:你不需要mod。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM