Random.NextDouble()([0.0,1.0)の範囲のDouble)に大きなInt64(Int64 big = 9000000000L)を掛けて、結果をフロア化して、Randomから取得できる値よりも大きいランダムなInt64値を取得する場合があります。 .Next()(範囲[0、Int32.MaxValue)からのInt32)。
Random r = new Random();
long big = 9000000000L;
long answer = (long) (r.NextDouble() * big);
[0.0、1.0)の範囲のDoubleの一意の値の総数は、生成される可能性のある一意のInt64の数の上限を提供しているように思われます。実際、多くの異なるDoubleが同じInt64にマップされるため、上界と下界は緩くなります。
したがって、知りたいのですが、[0.0、1.0)の範囲のdoubleの一意の値の総数はいくつですか?
「答え」が[0、big)の範囲の値になるように「大きな」が取ることができる最大値と、「答え」の値の分布が均一であるかどうかを教えていただければ、さらに良いでしょう。 Random.NextDouble()は均一です。
編集:ここでのDouble(double)はIEEE 754浮動小数点doubleを指し、Int64(long)とInt32(int)はそれぞれ64ビットと32ビットの符号付き2の補数を指します。
この質問に触発されました:Javaで10桁の一意の乱数を生成します
私はC#を使用しましたが、この質問は言語に依存せず、プログラミングよりも離散数学に関するものですが、主に数学的な好奇心からではなく、数式を使用する場合にのみ数式を使用したいというプログラマーの質問に悩まされています。セキュリティの観点から行うことになっています。