这会根据这些概率给出适当的随机数吗?C++

Dil*_*xel 5 c++ random probability

码:

int random = (rand() % 7 + 1)
if (random == 1) { } // num 1
else if (random == 2) { } // num 2
else if (random == 3 || random == 4) { } // num 3
else if (random == 5 || random == 6) { } // num 4
else if (random == 7) { } // num 5
Run Code Online (Sandbox Code Playgroud)

基本上我希望这些数字中的每一个具有以下每个概率:1:1/7 2:1/7 3:2/7 4:2/7 5:1/7

这段代码会给我正确的结果吗?即如果这是无限次运行,我会获得正确的频率吗?这样做的方法不那么冗长吗?

der*_*ert 7

不是,它实际上略有偏离,因为rand()的工作方式.特别是,rand返回[0,RAND_MAX]范围内的值.假设RAND_MAX为10.然后rand()将给出0 ... 10,并将它们(按模数)映射到:

0  ? 0
1  ? 1
2  ? 2
3  ? 3
4  ? 4
5  ? 5
6  ? 6
7  ? 0
8  ? 1
9  ? 2
10 ? 3
Run Code Online (Sandbox Code Playgroud)

注意0-3比4-6更常见; 这是随机数生成的偏差.(你也加1,但这只是改变它).

RAND_MAX当然不是10,但它也可能不是7(减1)的倍数.最有可能是两个人的力量.所以你会有一些偏见.

我建议使用Boost随机数库,它可以为你提供一个随机数发生器,产生1-7而没有偏差.另请参阅bames53使用C++ 11的答案,如果您的代码只需要针对C++ 11平台,这是正确的方法.


Igo*_*Oks -1

rand返回随机整数:

请注意,尽管此模运算不会在跨度内生成真正均匀分布的随机数(因为在大多数情况下, 较小的数字更有可能出现),但对于短跨度来说,它通常是一个很好的近似值。


现在,关于不太冗长的方法,您可以使用 switch-case 构造或一系列条件运算符 ?:(这将使您的代码简短且不可读:)。