c# - 等概率范围内的随机数

标签 c# random range prng

这可能比 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#,我只是用它作为示例。

最佳答案

我注意到没有人真正回答您帖子中的问题:

For example, the range is 10, so 2147483646 is not perfectly divisible by 10, so the values 1-6 have a slightly higher probability of occuring (because 2147483646 % 10 = 6). This is of course assuming that every value within Random.Next() [without overloads] returns a value between 0 and 2147483646 with equal probability.

How would one ensure that every number within a range has an equal probability of occuring?

是的,所以您只需丢弃导致不平衡的值。例如,假设您有一个 RNG 可以在 { 0, 1, 2, 3, 4 } 上产生均匀分布,并且您想用它在 上产生均匀分布>{ 0, 1 } 。天真的实现是:从 {0, 1, 2, 3, 4} 中提取,然后返回值 % 2;然而,这显然会产生有偏差的样本。发生这种情况是因为,正如您所注意到的,5(项目数)不能被 2 整除。因此,相反,抛出任何产生值 4 的抽奖。因此,该算法将是

 draw from { 0, 1, 2, 3, 4 }
 if the value is 4, throw it out
 otherwise, return the value % 2

您可以使用这个基本思想来解决一般问题。

however does every value between 1 and 10 have an equal probability of occuring?

是的,确实如此。来自 MSDN :

Pseudo-random numbers are chosen with equal probability from a finite set of numbers.

编辑:显然文档与 .NET 中的当前实现不一致。文档指出抽奖是统一的,但代码表明事实并非如此。然而,这并不能否定这是一个可解决的问题,我的方法是解决它的一种方法。

关于c# - 等概率范围内的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10178837/

相关文章:

c# - tcplistener 没有启动

C# 继承虚拟或重写

javascript - 尝试在范围 : Uncaught IndexSizeError: Failed to execute 'setEnd' on 'Range' 上使用 setStart 和 setEnd 时出错

c++ - 一个非常非常长的数的模数 (fmod)

c# - Visual Studio 中的大括号默认布局

c# - 用于在将字符串输入查询之前检查字符串是否存在的 LINQ 函数

MySQL RAND() 种子值几乎重复

使用 malloc 和指针在 C 中创建 2 个随机矩阵

python - 是否有返回排序列表的 list.sort() 版本?

java - 不使用 if else 计算范围的有效方法