如何从 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();
Random rnd = new Random(12345l);
对于相同的种子值,从 RNG 中得出的值将是相同的。
因为如果你输入相同的数组,你希望一遍又一遍地收到相同的结果;为什么不从数组中取出每 n 条记录?您可以通过将数组除以您想要的样本量来轻松计算 n。
但上述方法不能保证正确分配,除非您先对数组进行排序。
假设我有一个包含 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();
Random rnd = new Random(12345l);
对于相同的种子值,从 RNG 中得出的值将是相同的。
因为如果你输入相同的数组,你希望一遍又一遍地收到相同的结果;为什么不从数组中取出每 n 条记录?您可以通过将数组除以您想要的样本量来轻松计算 n。
但上述方法不能保证正确分配,除非您先对数组进行排序。