0
int[] r = new int[1000];

ExponentialDistribution exp = new ExponentialDistribution(4.0);

for(int i = 1; i <r.length; i++){
    r[i] = (int)exp.sample()  + 1 + r[i-1];
}

上面的代码将数组 [r] 从 r[0] = 0 填充到 r[999] = 4527。这是一次随机运行的结果。如果 r.length 增加到 2000,则最后一个元素 r[1999] 增加 8963。我试图找到将数组 [r] 填充在 0 - 5000 范围内的解决方案。即使 r.length 增加,数组也应该以指数方式填充在这个范围内。比如说在这种情况下,如果 r[999] <= 5000,那么 r[1999] 也应该 <=5000。

比如说,r.length 代表总数。事件和数组 r 的每个元素表示事件发生的时间。总时间为 5000 个单位。动机是第一个事件发生在时间 0,最后一个事件发生在时间 <=5000,即使 r.length 增加或减少,也应该相应地调整两个事件的发生时间。

非常感谢

4

1 回答 1

0

我认为您要求的是:用代表事件发生时间的数字填充任意长度的数组。最后一个事件的时间应该小于给定的数量。

如果您真的在模拟到达的事件,那么这没有多大意义。请参阅https://en.wikipedia.org/wiki/Arrival_theorem了解更多关于为什么不这样做的详细信息。但是,总而言之,您通常会决定事件发生的频率(平均)以及列表中有多少事件。要获得在给定时间结束的给定数量的事件的真实分布,您可能需要无限制地运行生成,然后缩减所有事件时间。但老实说,我不确定这样做有什么意义。

或者,如果您只想要两个按升序排序的范围之间的一组数字,那么这很容易:

int[] events = random.ints(count, min, max).sorted().toArray();

这不是泊松分布的真实模拟,但是如果没有关于您要达到的目标(以及为什么您认为需要指数分布)的更多信息,那么很难给出更具体的建议。

于 2017-03-10T02:35:47.733 回答