【问题标题】:cpp show result depends on the previous resultcpp show 结果取决于之前的结果
【发布时间】:2012-05-29 11:58:11
【问题描述】:

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

但问题是,如果例如。 perfect_to_action = 50 无法保证在第一次随机 action1 用户将获得 action2(通过 rand())。我正在寻找避免许多重复动作的方法。请建议如何根据之前的事件/或所有事件更准确地计数。带有示例和 cmets。目标是避免 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 等等。

【问题讨论】:

  • 您已经向我们提供了您当前的模型,但您没有告诉我们您正在建模什么。这些动作是什么? What is your goal?
  • 这是作业吗?考虑这样标记。这可能会导致人们有​​更多的耐心。我现在觉得这个问题难以理解
  • 所以你想保证他们随机得到一个之后,下一个按钮就会给另一个?
  • 结果分布的实际要求是什么?它显然不是随机的,因为随机数没有记忆,你每次都可以得到 action1,这仍然很好,因为下一次它可能是 action2。首先决定你想要什么。然后编码就更容易了。
  • 那么什么是好的?您的规范目前是矛盾的,您不能提供反对它。您需要一个定义可接受结果的规范。在这里查看stackoverflow.com/q/2060774/1002025 进行类似讨论。

标签: c++ random


【解决方案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%

【讨论】:

  • action_1_cutoff 已计入,但未使用。似乎需要与 rand() 比较?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 2018-12-04
    相关资源
    最近更新 更多