1. ホーム
  2. java

[解決済み] Math.random()対 Random.nextInt(int)。

2022-05-15 21:25:28

疑問点

とはどのような違いがあるのでしょうか? Math.random() * nRandom.nextInt(n) ここで n は整数ですか?

どのように解決するのですか?

ここで の詳細な説明です。 の理由を説明します。 Random.nextInt(n) がより効率的で偏りが少ないのは Math.random() * n Gili がリンクした Sun フォーラムのポストから引用しました。

Math.random()は内部でRandom.nextDouble()を使用しています。

Random.nextDouble() は Random.next() を2回使用して、仮数のビットがほぼ一様に分布する double を生成するので、0 から 1-(2^-53) までの範囲で一様に分布することになります。

Random.nextInt(n) は、平均して 2 回未満 Random.next() を使用します。それは 1 回使用し、得られた値が MAX_INT より下の n の最高倍数より上の場合は、再度試行し、それ以外は n のモジュロを返すので(これは MAX_INT 以下の n の最高倍数を超える値が分布を歪めることを防ぐ)0 から n-1 までの範囲で均一に分布する値が返されます。

6でスケーリングする前に、Math.random()の出力は、一様分布から引き出された2^53の可能な値のうちの1つです。

6 によるスケーリングでは、可能な値の数は変更されず、int 型にキャストすると、これらの値は 6 つの「バケット」 (0, 1, 2, 3, 4, 5) のいずれかに強制的に組み込まれ、各バケットは、可能な値の 1501199875790165 または 1501199875790166 (6 は 2^53 の外接ではないので) を網羅する範囲に対応します。これは、十分な数のサイコロを振った場合 (または十分に大きな面を持つダイス)、ダイスはより大きなバケットに偏っていることを示すことを意味します。

この効果が現れるまで、あなたは非常に長い時間サイコロを振って待つことになります。

Math.random()も約2倍の処理が必要で、同期の対象にもなります。