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

标签 c statistics simulation poisson

假设我有 3 种不同的硬币类型。例如:10 便士、50 便士和 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. 参数绑定(bind)到上面的约束。

最佳答案

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

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

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

起泡、冲洗,然后对其他类型的硬币重复上述步骤。概率会有所不同,但计算方式相同。只需确保对不同的硬币类型使用单独/独立的随机数即可。

关于c - 模拟投币机的真实统计分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55851491/

相关文章:

c - 搜索数组 - 将值替换为 C 中另一个数组中的值

java - 二十一点的概率分析

java - 计算多项分布的卷积

java - 伯特兰悖论模拟

java - 泊松变量、λ 与到达率联系、Java 网络模拟

c++ - 带有尾随注释的多行预处理器宏

C - 为函数内的双指针赋值

c - 当将 *void 项添加到 *void 数组中时,编译器如何知道要在内存中使用多少字节?

function - 评估 R 循环中的变量

animation - 将刚体模拟保存为动画