让我们假设我有一个包含200万个ID的数组。我现在想要检索这些ID的样本。目前我使用随机抽样,如本问题所述[{3}}。
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代码。
非常感谢您的每一个想法和答案,并与您分享。
答案 0 :(得分:2)
将种子传递给RNG。而不是:
Random rnd = new Random();
Random rnd = new Random(12345l);
对于相同的种子值,RNG产生的值将相同。
答案 1 :(得分:0)
因为如果输入相同的数组,想要反复接收相同的结果;为什么不从阵列中获取每个 n 记录?您可以通过将数组除以所需的样本大小来轻松计算 n 。
但是除非先对数组进行排序,否则上述方法不能保证正确的分布。