模拟一个概率事件:程序从入口进来后可能会执行三个分支A、B、C,其中执行A的概率是80%、执行B的概率是50%,执行C的概率是20%。

解决方案 »

  1.   

    数组里放8个A,5个B,2个C,
    随机(0-14)
      

  2.   

    把8个A,5个B,2个C 放入不排序的数组中 
         再直接遍历判断就可以了
      

  3.   

    一个事件要分成A:0.8、B:0.5、C:0.2,从逻辑上说A与B中有共同符合的条件,存在两个不确定因素
    首先共同条件占整个事件比从0.00...01到0.5都有可能
    当是共同条件,LZ要如何执行?
    坐等高手解答
      

  4.   

    楼主的命题很有意思,首先分析下它的数学模型。
    假设是在一个系统内,三个事件的概率分别为 80%,50%,20%,这是不可能的,因为全部加起来总的概率大于   1 了。就好像下面的方程组在实数范围内应该是无解的一样:
    a/(a+b+c)=0.8
    b/(a+b+c)=0.5
    c/(a+b+c)=0.2
    所以我认为三个事件应该是相互独立互不干扰的。算法设计:首先取得一个随机数,然后对这个随机数对 10 取模,根据余数确定事件是否执行(注意不是根据余数确定执行哪个事件)。并且由于三个事件互相独立,每判定一次是否执行事件就需要取一次随机数。所以在程序中不能使用 switch 语句,只能使用 if() else 语句判断。int i;
    int RandomInt() //定义一个取得随机数的函数
    {
        ......
    }
    if(((i=RandomInt()%10)==8)||(i==9))  //余数为8或者9时
    {
        //执行概率为20%的事件3
    }else if(((i=RandomInt()%10)>0)&&(i<6))  //重新取得随机数并对10取模进行判定是否在0-6之间
    {
        //执行概率为50%的事件2
    }else if(((i=RandomInt()%10)>=0)&&(i<=8))  //重新取得随机数并对10取模进行判定是否为0-8
    {
        //执行概率为80%的事件
    }因为前两个事件的概率太高,为了保证低概率的事件也有机会执行,我先判定了低概率的事件,还有上面的代码不一定严谨,只是为了方便说明问题。最后,如果说是同一系统下的三个事件,比如说概率为:20%。30%,50%,就只需要取一次随机数的模。依次判定就可以了,并且可以使用switch语句。