【发布时间】:2012-04-16 17:32:55
【问题描述】:
这可能比 C# 更与数学相关,但我需要一个 C# 解决方案,所以我把它放在这里。
我的问题是关于随机数生成器的概率,更具体地说,是否每个可能的值都以相等的概率返回。
我知道有 Random.Next(int, int) 方法返回第一个整数和最后一个整数之间的一个数字(最后一个是排他的)。
Random.Next() [无重载] 将返回一个介于 0 和 Int32.MaxValue(即 2147483647)- 1 之间的值,因此为 2147483646。
如果我想要一个介于 1 和 10 之间的值,我可以调用 Random.Next(1, 11) 来执行此操作,但是 1 和 10 之间的每个值都有相同的发生概率吗?
例如,范围是 10,所以 2147483646 不能完全被 10 整除,所以值 1-6 出现的概率稍高(因为2147483646 % 10 = 6)。这当然是假设Random.Next() [没有重载] 中的每个值都以相等的概率返回 0 到 2147483646 之间的值。
如何确保一个范围内的每个数字都有相同的出现概率?假设对于一个彩票类型的系统,某些人比其他人拥有更高的概率是不公平的,我并不是说我会为此使用 RNG 中内置的 C#,我只是将其用作示例。
【问题讨论】:
-
Random不是要使用均匀数字分布的对象,因为返回的值必然是随机的(或在这种情况下是伪随机的)。使用随机数生成器完全可以生成 1,1,1,1,1,1 的序列。事实上,每次调用它时,它都可能始终为 1,尽管这不太可能。 -
但从长远来看,它会(应该)限制为均匀随机分布。
-
@Tejs:掷硬币 100 次,得到 100 次同一张脸也是可能的(但不太可能)
-
从长远来看是均匀分布的。如果您想要更强大的东西,请查看 Mersenne Twister 或加密 PRNG。
-
@Matthew:这就是均匀分布。