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

时间:2010-11-24 18:48:17

标签: c function random

我想在特定范围内制作随机数,例如“选择18到35之间的随机数”?如何使用rand()函数执行此操作?

4 个答案:

答案 0 :(得分:12)

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

假设您始终返回数字的随机数生成器 在一定的范围内。仅仅为了争论,让我们说范围是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 Algorithm - Modulo Bias。 要消除此偏差,您需要计算小于rand()返回的最大数字,但均匀地除以(High - Low + 1)。 在你的情况下是3640 * 18 = 65520.使用它作为数字的高范围过滤器 由rand()返回 如下:

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

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

答案 1 :(得分:6)

如果这是用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 - the fencepost error

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

int random_between(int min, int max) {
    return rand() % (max - min + 1) + min;
}

答案 2 :(得分:0)

  1. 你想要整数吗?
  2. 您想要统一分发吗?
  3. 您是否希望将18和35都包含为可能值?
  4. 您更喜欢使用哪种语言?
  5. 一般来说,如果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)。

    希望有所帮助。

答案 3 :(得分:-1)

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

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

编辑:你不需要mod。