5

(1,n)範囲内にあるが特定のリストにない乱数を生成するにはどうすればよい(i,j)ですか?

例: 範囲は(1,500)、リストは[1,3,4,45,199,212,344]です。

注: リストはソートされない場合があります

4

4 に答える 4

1

すでに説明したように、可能であれば棄却サンプリングが最も簡単です。ただし、それを使用したくない場合は、範囲と許可されていない値をセットに変換して、違いを見つけることができます。次に、そこからランダムな値を選択できます。

範囲を [1,n] ではなく [i,j] にし、それらを均一に分散させたいと仮定します。

Python で

total = range(1,n+1)
disallowed = range(i,j+1)
allowed = list( set(total) - set(disallowed) )

return allowed[random.randrange(len(allowed))]

(すべての可能性が高いため、これは正確に均一ではないことに注意してください。ただし、これはmax_rand%len(allowed) != 0ほとんどの実際のアプリケーションでは非常に近いものになります)

于 2013-07-17T20:07:31.137 に答える