【问题标题】:generate normal distributed timestamps within a range [0,x]在 [0,x] 范围内生成正态分布的时间戳
【发布时间】:2013-05-25 14:09:32
【问题描述】:

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

问候

【问题讨论】:

    标签: java statistics normal-distribution


    【解决方案1】:

    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);
    

    【讨论】:

      【解决方案2】:

      我同意 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 是控制分布扩展的参数。

      【讨论】:

        猜你喜欢
        • 2017-01-08
        • 1970-01-01
        • 2017-07-13
        • 2021-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多