如何从 java 数组中获取非随机样本

How can I take a non random sample from a java array

假设我有一个包含 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 代码投入使用。

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

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

Random rnd = new Random();

Use this:

Random rnd = new Random(12345l);

对于相同的种子值,从 RNG 中得出的值将是相同的。

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

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