我是C / C ++的新手。我试图以一定的概率运行代码。
例如,我知道以下代码使其以1/2概率运行:
if (rand() % 2) {
// runs 1/2 the time
}
但我不知道让它运行1/4(25%)的最好方法。当我输入时:
if (rand() % 4) {
// runs 1/4 the time
}
它运行的次数超过四次。我也尝试过:
if (rand() % 2) {
// 1/2
if (rand() % 2) {
// 1/2 * 1/2 = 1/4
}
}
哪个有效,但它似乎不是最好的方式。此外,该方法仅适用于1 / 4,1 / 8,1 / 16等。我不知道如何做1/6的例子。
答案 0 :(得分:6)
您应该在== 0
声明中添加if
。
if (rand() % 4 == 0) {
// runs 1/4 the time
}
rand()
返回一个正整数,可能非常大。模数运算符%
执行除法并给出余数。例如,如果取一个大数并除以4,则余数必须为0,1,2或3.它不能是其他任何东西。通过检查余数是否等于0,我们选择了四种可能情况之一。这意味着概率为25%。
原始代码运行过于频繁的原因是,if语句中的rand() % 4
将除0之外的所有内容都计为true。因此,如果余数为1,2或3,则条件运行。换句话说,您的代码运行时间为3/4。
答案 1 :(得分:0)
在我们使用rand()之前,我们需要为它设置种子。我们可以使用时间戳,例如srand(time(NULL))
。
rand() % n
的结果在0,1,2 ... n-1中具有均匀的随机分布,因此只需在其中选择一个数字,例如0
因此,如果您想以某种可能性运行代码,例如1/6
,则可以n = 6
,所以:
n = 6;
if (rand() % n == 0) {
// your code
}
注意:请注意n
,它不能大于RAND_MAX
,这是由编译器定义的。
答案 2 :(得分:-2)
我认为这里的每个人都以错误的方式思考这个问题,有一个更简单(但有点更冗长)的方式来获得这样的简单概率,这种方式可以更好地解释自己。
srand(time(NULL))
int number;
number = rand() % 2 +1;
if (number == 1)
{
//Do something
}
if (number == 2)
{
//Do something
}
现在,如果你像我一样,你发现现有的RNG不够随意,我们可以说明我喜欢称之为Ghetto Gaussian RNG"的方法,这将是强制计算机生成大数字,但除非它们等于1或2,否则永远不要使用它们。
srand(time(NULL))
string sky = "blue"; //string for while loop
int number;
int hold; // hold the initial result of the RNG
while(sky == "blue") //if the sky is blue, keep looping
{
hold = rand() % 10000 +1;
number = hold/7; //divide hold by 7, store in number
if (number == 1)
{
//Do something
break; //if the result of the division above is exactly
//1, break the loop
}
if (number == 2)
{
//Do something
break; //if the result of the division above is exactly
//2, break the loop
}
}
它可能看起来很奇怪,但它确实可以增加随机性"现货RNG' s。