【发布时间】:2013-05-25 14:09:32
【问题描述】:
我想生成一个包含时间戳(介于 0 和绑定值 x 之间的整数,按递增顺序)的文件,它表示事件的到达。 “事件到达率”应该是“正态分布的”,这意味着,在数据集的“中间”,到达率应该在开始和结束时更频繁。 如何使用 java 生成这样的值列表?
问候
【问题讨论】:
标签: java statistics normal-distribution
我想生成一个包含时间戳(介于 0 和绑定值 x 之间的整数,按递增顺序)的文件,它表示事件的到达。 “事件到达率”应该是“正态分布的”,这意味着,在数据集的“中间”,到达率应该在开始和结束时更频繁。 如何使用 java 生成这样的值列表?
问候
【问题讨论】:
标签: java statistics normal-distribution
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);
【讨论】:
我同意 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 是您希望曲线的“峰值”所在的位置(可能是 max/2),而 WIDTH 是控制分布扩展的参数。
【讨论】: