模拟投币机的真实统计分布

Simulate a realistic statistical distribution of a coin machine

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

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

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 线以触发电子板上的输入。这是硬件和固件的"stress-test"。需要分发版才能为固件提供真实数据。

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

看起来你想使用一组non-homogeneous Poisson processes, which is the fancy way of saying the rate changes over time. The amount of time between Poisson occurrences has an exponential distribution with the same rate as the Poisson. Since you're modeling this with discrete time steps of one second, you can get a very good approximation to the exponential using a geometric distribution。您只需要将速率转换为秒,然后转换为给定秒内发生的概率。

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

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

对其他类型的硬币起泡沫、冲洗并重复上述步骤。概率会有所不同,但计算方式相同。只需确保对不同的硬币类型使用 separate/independent 个随机数。