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