サイズが未定の配列からk 個の乱数を取得するには、リザーバー サンプリングと呼ばれる手法を使用します。サンプルコードでそれがどのように起こるかを簡単に強調できますか?
28303 次
4 に答える
44
私は実際にこれに名前があることに気づいていなかったので、これを最初から証明して実装しました:
import random
def random_subset( iterator, K ):
result = []
N = 0
for item in iterator:
N += 1
if len( result ) < K:
result.append( item )
else:
s = int(random.random() * N)
if s < K:
result[ s ] = item
return result
終わり近くに証拠があります。
于 2010-04-10T08:59:03.023 に答える
2
ジャワ
import java.util.Random;
public static void reservoir(String filename,String[] list)
{
File f = new File(filename);
BufferedReader b = new BufferedReader(new FileReader(f));
String l;
int c = 0, r;
Random g = new Random();
while((l = b.readLine()) != null)
{
if (c < list.length)
r = c++;
else
r = g.nextInt(++c);
if (r < list.length)
list[r] = l;
b.close();}
}
于 2012-02-01T07:42:47.360 に答える