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) 范围内双精度的唯一值总数是多少?
如果你能告诉我“大”可以取的最大值是多少,这样“答案”可以是 [0,big) 范围内的一个值,以及“答案”的值的分布是否均匀,那就更好了,假设Random.NextDouble() 是统一的。
编辑:这里的 Double (double) 指的是 IEEE 754 浮点双精度,而 Int64 (long) 和 Int32 (int) 分别指的是 64 位和 32 位有符号 2 的补码。
受这个问题的启发:Generating 10 digits unique random number in java
当我使用 C# 时,这个问题与语言无关,更多的是关于离散数学而不是编程,但它困扰我的主要不是数学上的好奇心,而是一个程序员想要使用公式,只有当它做它的时候应该这样做,并且从安全的角度来看。