1

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

问候

4

2 回答 2

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 是您希望曲线的“峰值”所在的位置(可能是 max/2),而 WIDTH 是控制分布扩展的参数。

于 2013-05-30T06:02:02.003 回答
0

Java 有一个Random类,其中一种方法是 a 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);
于 2013-05-30T05:54:30.543 回答