【问题标题】:Simulate a realistic statistical distribution of a coin machine模拟投币机的真实统计分布
【发布时间】:2019-04-25 14:18:10
【问题描述】:

假设我有 3 种不同的硬币类型。示例:10p、50p 和 1£。 我知道一天中每种类型的平均插入硬币数量:

  • 晚上 10 点:上午 10 点到下午 4 点之间为 50,其余时间为 30
  • 50 点:上午 11 点到晚上 7 点之间 30 点,其余时间 10 点
  • 1£:下午 1 点到 3 点之间 10 点,一天中的其余时间 2 点

在我的代码中,我有一个每秒调用一次的函数:

typedef enum
{
    none,
    p10,
    p50,
    P1
} CoinType;

CoinType toosCoin(time_t now) // called every second
{
    CoinType coin = none;
    // do some math

    return coin;
}

我想模拟上述参数描述的分布,但我不确定什么是最好的方法,也不是正确的分布。

然后代码将根据所选硬币(如果有)激活物理 I/O 线,以触发电子板上的输入。这是硬件和固件的“压力测试”。需要分发来为固件提供真实的数据。

我想我需要像泊松分布这样的东西,但我不明白如何将 P. 参数绑定到上述约束。

【问题讨论】:

  • 那里没有足够的描述来做正确的工作。这是课堂作业吗?应该还有更多。
  • 这不是课堂作业!!!我在问题中说。我开发了一个硬件板,我需要触发它的输入,以真实的方式对其进行压力测试。
  • 如果缺乏信息,告诉我我必须添加的内容比仅仅投反对票更有用 - 这不太可能导致问题得到改善。
  • 我没有投票。
  • 是的,但问题不在于这种场景的有效性——它只与如何编码有关。

标签: c statistics simulation poisson


【解决方案1】:

您似乎想使用一组non-homogeneous Poisson processes,这是表示费率随时间变化的奇特方式。泊松发生之间的时间量具有与泊松相同的指数分布。由于您使用一秒的离散时间步长对此进行建模,因此您可以使用geometric distribution 获得非常好的指数近似值。您只需要将速率转换为秒,然后转换为给定秒内发生的概率。

我以 10p 硬币为例,其他类似。有两种不同的费率:上午 10 点到下午 4 点 50 个硬币/6 小时,以及一天中剩余时间 30 个硬币/18 小时。由于一小时有 3600 秒,因此它们分别转换为每秒 5/2160 和 1/2160 的速率。反过来,这些可以被视为每秒获得一枚硬币的概率。请注意,这些概率是基于 Poisson 假设的近似值,即您永远不会在足够小的时间间隔内出现两次或更多次。我怀疑你可能会争辩说,考虑到投币机制,这是一秒级别的合理假设。

如果你买了它,那么生活很容易。当您的函数被调用时,生成一个介于 0.0 和 1.0 之间的统一浮点随机数。如果它小于或等于与当前时间相关的概率,则您获得 10 便士硬币,否则您没有。 (如果您更喜欢整数数学,则生成一个均匀分布在 1 到 2160 之间的 int,如果它在上午 10 点到下午 4 点之间小于或等于 5,或者在一天中的其余时间为 1,那么您将获得一枚硬币。只要确保不要用2160取模得到随机数,免得你引入modulo bias。)

对其他硬币类型进行起泡、冲洗和重复操作。概率将不同,但以相同的方式计算。只需确保为不同的硬币类型使用单独/独立的随机数。

【讨论】:

  • 你得到了我所需要的。谢谢你非常清楚的解释。按照您的提示,我还可以在一天中甚至在不同的日子添加几个具有不同概率的“窗口”。
  • 听起来不错。工作日、周末、发薪日和大型体育赛事往往都不同。
猜你喜欢
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
相关资源
最近更新 更多