【问题标题】:How can I take a non random sample from a java array如何从 java 数组中获取非随机样本
【发布时间】:2015-05-22 08:23:38
【问题描述】:

假设我有一个包含 200 万个 ID 的数组。我现在想检索这些 id 的样本。目前,我使用此问题答案here 中提出的随机抽样。

private static void shuffleScoreArray(ScoreDoc[] ar) {
    Random rnd = new Random();
    for (int i = ar.length - 1; i > 0; i--) {
        int index = rnd.nextInt(i + 1);
        // Simple swap
        ScoreDoc a = ar[index];
        ar[index] = ar[i];
        ar[i] = a;
    }
}

这很好用,但我现在如何检索非随机(或多或少分布良好 - 不必 100% 均等)采样?在这种情况下,非随机意味着如果我两次调用具有相同输入数组的函数,我将两次获得相同的结果样本。

我刚刚对 SO 和 Google 进行了大量研究,但在这种情况下找不到帮助我的方法。 SO 上的大多数方法似乎都处理随机抽样方法或增加性能步骤。

我可以想象(但不知道是否有效)是您总是使用相同的 Random 对象,但我不确定如何将其按预期的 java 代码工作。

非常感谢您与我分享的每一个想法和答案。

【问题讨论】:

    标签: java arrays random shuffle sample


    【解决方案1】:

    将种子传递给 RNG。而不是这个:

    Random rnd = new Random();
    

    Use this:

    Random rnd = new Random(12345l);
    

    对于相同的种子值,来自 RNG 的值将是相同的。

    【讨论】:

    • 这似乎行得通,我现在将评估它以获得更大的规模:)
    【解决方案2】:

    因为如果你输入相同的数组,你想一遍又一遍地收到相同的结果;为什么不从数组中取出每 n 条记录?您可以通过将数组除以您想要的样本大小轻松计算 n

    但上述方法并不能保证正确的分布,除非你先对数组进行排序。

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 1970-01-01
      • 2013-08-18
      • 2010-12-11
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      相关资源
      最近更新 更多