大きな入力/階層の問題になることができますが、メモリにすべての入力をロードされた特定のソリューションのほとんどの問題点。ここには、Tom ChristiansenとNat TorkingtonのThe Perl Cookbookに適合するソリューションがあります。ディレクトリの下の任意の場所にランダムなファイルを取得するには:
#! /usr/bin/env python
import os, random
n=0
random.seed();
for root, dirs, files in os.walk('/tmp/foo'):
for name in files:
n=n+1
if random.uniform(0, n) < 1: rfile=os.path.join(root, name)
print rfile
ビットを一般は便利なスクリプトを作る:私は私の質問の入力が完了する前に
$ cat /tmp/randy.py
#! /usr/bin/env python
import sys, random
random.seed()
n=1
for line in sys.stdin:
if random.uniform(0, n)<1: rline=line
n=n+1
sys.stdout.write(rline)
$ /tmp/randy.py < /usr/share/dict/words
chrysochlore
$ find /tmp/foo -type f | /tmp/randy.py
/tmp/foo/bar
申し訳ありませんがみんな、私が誤って提出しました。しかし、あまり変わってはいけません。 – JasonSmith
競争条件の問題を明確にすることはできますか?私はあなたが間違ったウィンドウを選択してファイルを開くことを意味すると思っています(例えば、誰かがそれを選択して開こうとする間にそのファイルを削除するかもしれませんが、これを明示的に述べる価値があります)。 – Brian
複数のプロセスがこれを同時に実行するため競合状態ですか?または、ライターがファイルを作成しているため、競合状態が発生しますか?これを選択しているリーダーですか? –