假设我有 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/