私は昨日、APコンピュータサイエンスコースでこの質問にぶつかった。JavaのMath.random()が他の間隔ではなく[0、1]でdoubleを返すのはなぜですか?
私のCS教師に尋ねる - >彼はそれを知らない。
ウェブ検索 - >関連性の低い回答。
学問記事 - >試してもわかりません。
この質問は、乱数生成のアルゴリズムに関係すると思います。
私は昨日、APコンピュータサイエンスコースでこの質問にぶつかった。JavaのMath.random()が他の間隔ではなく[0、1]でdoubleを返すのはなぜですか?
私のCS教師に尋ねる - >彼はそれを知らない。
ウェブ検索 - >関連性の低い回答。
学問記事 - >試してもわかりません。
この質問は、乱数生成のアルゴリズムに関係すると思います。
はい、それはアルゴリズムがダウンしていますが、可能な限り簡単に範囲を操作できるように設計されていると思います。別の整数を乗算します。他のランダム関数の利便性と標準のほかに特別な理由はないようです。
これは最も理にかなっているため、[0、1]で数値を返します。単純な式で他の間隔[ロー、ハイ)に変換するのは簡単です:
low + Math.random() * (high - low)
あなたはそれが均等に簡単に変換特性を有する他に何を選びますか?
許容ビットパターンには2倍を表す制約があります。したがって、ランダムビットのロードを生成して、それが有効な倍数であると予想することはできません。 NaN
とINFINITY
のようなものと完全に無効なパターンがあります。
これを考えると、二重を生成する最も簡単な方法は除算を行うことです。コードは既に必要なすべての作業を行うためのものです。最高の穀粒を得るために、2つの大きな数字を低い結果で分割する必要があります。 )最もランダムな整数発生器は、0°の範囲内max_randomを生成するため
random_double = random_integer/(1.0 * max_random)
)次いで、得られた二重の範囲である[0、1.0:そのようなものを意味します。
$ 0.012
1.0を生成しないようにするには 'random_integer /(max_random + 1.0)'にする必要があります。 (または、あなたは、掛け算の間隔が半分ではなく閉じていると言う必要があります。)副次的な利益として、除数は2の累乗になりますので、除算は正確で、高速計算方法があります。 – rici
あなたが正しい番号を知っていたとしても、実際には役に立たないでしょう。同様に、ランダムなダブルを公平なダイロールの結果に変換しようとすると、ぎこちなくなります。 –
「最も合理的」であるという大胆な声明。 'Math.random(low、high)'は現在のインターフェースのために表示されるバイアスバグをすべて最小限に抑え、最小限に抑えます。 –
@EmilVikström私は固定間隔の間、ほとんどの意味を意味します。 – Henry