使用指数分布在特定范围内使用随机数填充数组

时间:2017-03-10 01:34:33

标签: java arrays normal-distribution exponential-distribution

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增加或减少,也就是应该相应地调整两个事件的发生时间。

非常感谢

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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