対数分布の乱数を生成しようとしています。
ここで、n = 1は半分の時間で発生し、n = 2は4分の1の時間で発生し、n=3は8分の1の時間で発生します。
int maxN = 5;
int t = 1 << (maxN); // 2^maxN
int n = maxN -
((int) (Math.log((Math.random() * t))
/ Math.log(2))); // maxN - log2(1..maxN)
System.out.println("n=" + n);
ほとんどの場合、必要な結果が得られますが、頻繁に、n
よりも大きい値が得られますmaxN
。
なんでそうなの?私の見方では、の最大値Math.random()
は1.0です。
したがって、の最大値(Math.random() * t))
はt
;です。
したがって、t = 2 ^ maxNであるため、log2(t)の最大値はmaxNです。
私の論理はどこで軌道に乗ったのですか?
ありがとう