有没有比以下更好的方式:
#define BOUND 7
int r;
int e = 1;
r = rand() % BOUND;
while (r == e){
r = rand() % BOUND;
}
用于生成除值e
以外的范围内的数字?
答案 0 :(得分:10)
您所要求的是生成[0, BOUND)
范围内的随机数,不包括值e
algorithm explained here似乎是不使用循环的最佳方法。
这是C代码:
#define BOUND 7
int r;
int e = 1;
r = rand() % (BOUND-1);
if (r >= e){
r = r+1;
}
因此,您基本上生成[0, BOUND-1)
范围内的值,如果该值大于或等于排除值e
,则将随机数递增1。
请注意使用rand
与%
并不能保证在生成的数字之间进行严格的统一分配。有关详细信息,请check out this question/answers。
答案 1 :(得分:5)
要在值之间均匀分布的范围内生成伪随机数,使用rand()
返回的值的大小而不是其余部分{{1}更可靠}:
rand() % BOUND
int r = (long long)rand() * BOUND / (RAND_MAX + 1LL);
返回rand()
和0
之间的值:该部门必须使用RAND_MAX
,因此结果位于RAND_MAX + 1LL
范围内。{{ 1}}排除(由chux评论)。
如果要排除给定值,请将范围缩小1并调整结果:
0
这是一个更通用的版本:
BOUND