2015-03-19 111 views
1

假设我有一个包含2百万个ID的数组。我现在想要检索这些ID的样本。目前我使用的是这个问题中提出的随机抽样回答here如何从java数组中抽取非随机样本

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上的大多数方法似乎都是处理随机抽样方法或者增加性能步骤。

我可以想象的(但不知道是否工作)是,你总是使用相同的随机对象,但我不确定如何把它作为预期的Java代码工作。

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

回答

2

将种子传给RNG。取而代之的是:

Random rnd = new Random(); 

Use this

Random rnd = new Random(12345l); 

出来的RNG的值将是相同的种子值相同。

+0

这似乎工作,我会评估它现在更大的尺度:) – Waylander 2015-03-19 09:45:40

0

既然你想一次又一次地接收相同的结果,如果你输入相同的数组;你为什么不把数组中的每个记录都记录下来?您可以轻松计算n将阵列除以所需的样本大小。

但是,除非您先排序数组,否则上述方法不能保证正确的分布。