2011-01-26 16 views
1

私は短い乱数入力を持っています。たとえば、int 0-999としましょう。短い乱数から長い乱数を生成する方法は?

私は入力の分布を知りません。ここでは、分布形状を変更せずに、入力に基づいて0-99999の範囲の乱数を生成したいと考えています。 私は入力を[0,1]に999で割って、それから複数の99999で結果を得る方法があることを知っています。しかし、この方法ではすべての可能な値をカバーするわけではありません.99999は決してヒットしません。次の2つの連続した入力を取り、それらを組み合わせることができます...あなたの入力は、乱数の発生源のいくつかの種類である

を想定し

+4

乱数ソースのエントロピーが利用可能であるよりも多く求めているようです。これはできません。あなたが分散アルゴリズムを探しているなら、math.stackexchange.comを見てください。 –

+0

あなたが今までに得た答えは**あなたの流通が一様であると思います。 –

+0

私は愚かな質問をしたと思う。だから今私はすでに答えがあると信じています。思い出してくれてありがとう:) – Frank

答えて

1

input() + 1000*(input()%100) 

は、しかし注意してください。これは、多くのエントロピーを有するソースに依存しているので、与えられた入力番号の後に常に同じ後続の入力番号が続くとは限らない。あなたのソースが何らかの方法で0-999の間を循環するように設計されたPRNGなら、このテクニックはうまくいかないでしょう。

ほとんどの生産エントロピーソース(たとえば、/ dev/urandom)では、これは正常に動作するはずです。 OTOHは、プロダクションエントロピーソースを使用して、0-99999の間の乱数をかなり直接取得できます。

0

次のような何かを試すことができます:

(input * 100) + random 

を問題が入力のみを使用している100の範囲を指定することである

0〜99のランダムはランダムな番号です。たとえば、50は、(同様の形状分布を維持するために)5000と5100の間の数値を持つと言うだけです。選択する5000〜5100の数字はあなた次第です。