cpp显示结果取决于之前的结果

时间:2012-05-22 23:17:01

标签: c++ random

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

但问题是如果例如。 perfect_to_action = 50无法保证在第一个随机action1用户获得action2后(通过rand())。我正在寻找避免许多重复行动的方法。请建议如何更准确地计算考虑上一个事件/或所有事件。以及示例和评论。目标是避免rund()可以提供过多的重复操作。例如,百分比= 50兰德()可以给出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等。

2 个答案:

答案 0 :(得分:1)

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%

答案 1 :(得分:0)

如果您不希望重复操作,您可以a)从所有选择中选择最后一个操作,或者b)选择您现在的操作,但继续重新选择,直到您获得除上一个操作之外的其他操作。后者更容易做,但速度较慢(可能慢了很多)。