生成[0,x]范围内的正态分布式时间戳

时间:2013-05-30 05:39:49

标签: java statistics normal-distribution

我想生成一个包含时间戳的文件(0和绑定值x之间的整数,按升序排列),表示事件的到达。 “事件到达率”应该是“正态分布”,这意味着,在数据集的“中间”某处,到达率应该更频繁地在开始和结束时。 如何使用java生成这样的值列表?

问候

2 个答案:

答案 0 :(得分:1)

我同意greedybuddha高斯函数是你想要的,但你也说过你希望你的事件被排序 - Random.nextGaussian()不会给你这个,它会给你随机数字正常分布。相反,使用高斯函数计算每个时间点的事件频率:

for (int t = 0; t < max; t++)
{
    f = Math.exp(-Math.pow(t - CENTER, 2.0) / (2.0 * Math.pow(WIDTH, 2.0)));
    for (int j = 0; j < f; j++)
    {
        writeEvent(t);
    }
}

CENTER是您希望曲线的“峰值”(可能是最大值/ 2),WIDTH是控制分布扩散的参数。

答案 1 :(得分:0)

Java有一个Random类,其中一个方法是nextGaussian,它将为您提供0-1.0的正态分布(高斯分布和正态分布是同义词)。

从那里你只需要乘以你的范围即可得到该范围内的值。

Random random = new Random();
public int nextNormalTime(int upperTimeBound){
    return (int)(random.nextGaussian()*upperTimeBound);
}

如果要创建这些的有序列表,您只需将时间添加到列表中并进行排序,或者像PriorityQueue一样。

List<Integer> list = new ArrayList<Integer>(nTimes);
for (int i=0;i<nTimes;i++){
    list.add(nextNormalTime(upperTimeBound));
}
Collections.sort(list);