我想在特定范围内制作随机数,例如“选择18到35之间的随机数”?如何使用rand()
函数执行此操作?
答案 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)
一般来说,如果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。