0

我们有按钮。用户单击按钮并接收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!

附言。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:(首先按 rand)如果第一个 action1 比 action1 比 action2 比 action1 比 action1 比 action2 等等。

4

2 回答 2

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%
于 2012-05-22T23:54:34.277 回答
0

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

于 2012-05-22T23:21:04.793 回答