如何在C中以"相同概率"获得0到N-1的随机数?

And*_*yer 5 c random algorithm

我知道这可能是一个"老"问题,但我想关注概率.

第一个问题是:在C,rand()将从给一个号码0RAND_MAX,并在此区间的每个号码必须被由所选择的相同的概率rand()

第二个问题:如果rand()允许每个数0RAND_MAX具有将被选择了相同(或近似相同)的概率,当我想从0得到一个随机数到N-1(N-1 <RAND_MAX),我会做一般来说:

rand()%N
Run Code Online (Sandbox Code Playgroud)

但如果RAND_MAX不是N的倍数,则从0到N-1中选择的随机数的概率可能不相同

例如,假设RAND_MAX = 150且N = 100,当我这样做时rand()%100,从0到49的数字将被选择的概率高于从50到99的数字,因为150不是100的倍数.

C中是否有算法或函数,可以让每个随机数具有相同的概率选择?

mah*_*mah 0

使用 时,无法确定结果的真正随机程度rand(),这在很大程度上取决于系统提供随机数的方式。如果您搜索,可以找到各种第 3 方伪随机数生成器 (PRNG) 软件包,但如果随机性极其重要,那么涉及硬件的解决方案可能会更好。

你是对的,简单地消除多余的东西就会对价值观产生偏见。您可以通过除以随机生成器可以提供的最大值将随机结果转换为浮点来避免这种情况,然后将其乘以您愿意处理的值范围内的元素数量。如果您的范围不是从 0 开始,您将添加您期望的基值。