我们有按钮。用户单击按钮并接收action1action2取决于变量percent_to_action2(从0到100)。给他action1action2的最简单方法是基于rand() % 100并与percent_to_action2进行比较。

但是问题是,如果例如。 perfect_to_action = 50没有保证,在第一个随机action1用户之后,将获得action2(由rand()获得)。我正在寻找避免许多重复动作的方法。请考虑上一个事件或所有事件,建议如何更准确地计数。带有示例和评论。目标是避免rund()可以进行过多的重复操作。例如,百分比= 50 rand()可以给10/10 action2!

ps。 perfect_to_action可以随时更改。
pps。对不起我英语。

我的代码:

                int num_rand = (rand() % 100 ) + 1; // from 1 to 100
                if (  num_rand <= current_percent_to_action2 )
                {
                    // action 1
                } else {} // action2


我想要的示例:

百分比= 50:
action1比action2比action1比action2等

百分比= 33:
(首先是兰德)
如果第一个action1比action1比action2比action1比action1比action2比等等,等等。

最佳答案

static unsigned num_action_1 = 1;
static unsigned num_action_2 = 1;
double bias = double(num_action_2)/num_action_1;
double randomchance = 1.0-current_percent_to_action2/100.0;
double action_1_cutoff = RAND_MAX*randomchance*bias;
if (  rand() <= action_1_cutoff ) {
    // action 1
    ++num_action_1;
} else {
    // action2
    ++num_action_2;
}


这会将随机性偏向发生频率较低的期权。我也对其进行了更改,以使动作2大约在百分之current_percent_to_action2的时间内发生,而不是像代码中那样执行动作1。从该图表可以看出,它增加了很多复杂性,但是获得不平衡结果的可能性要小得多。从长远来看,尽管它们实际上最终将完全相同,但两者最终都将连续给出10个字符串,该代码的启动甚至更加均匀。

times #1     Even distribution    Biased distribution
    1               50%                  50%
    2               25%                   8.3%
    3               12.5%                 3.125%
    4                6.25%                1.25%
    5                3.13%                0.52%
    6                1.56%                0.22%
    7                0.78%                0.09%
    8                0.39%                0.04%
    9                0.20%                0.02%
    10               0.10%                0.01%

关于c++ - cpp显示结果取决于先前的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10711428/

10-11 01:50