什么是在不连续范围内生成随机数的最佳方法?

时间:2017-11-13 18:38:39

标签: c algorithm

有没有比以下更好的方式:

#define BOUND 7

int r;
int e = 1;

r = rand() % BOUND;

while (r == e){

    r = rand() % BOUND;
}

用于生成除值e以外的范围内的数字?

2 个答案:

答案 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