以一定概率运行代码

时间:2016-02-04 02:17:25

标签: c++ c

我是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的例子。

3 个答案:

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