当前位置: 首页 > 知识库问答 >
问题:

在一个范围内产生一个无偏随机整数的最优算法是什么?

柴飞扬
2023-03-14

接受的答案建议使用以下公式,用于在给定的minmax之间生成一个随机整数,其中minmax包括在范围内:

output = min + (rand() % (int)(max - min + 1))

但它也说

这仍然是稍微偏向较低的数字...也可以扩展它,这样它就可以消除这种偏向。

static const double s_invRandMax = 1.0/((double)RAND_MAX + 1.0);
return min + (int)(((double)(max + 1 - min))*rand()*s_invRandMax);

共有1个答案

公孙宏畅
2023-03-14

当随机数发生器的输出数(RAND_MAX+1)不能被所需范围(max-min+1)均匀整除时,就会出现问题。由于将存在从随机数到输出的一致映射,因此某些输出将映射到比其他输出更多的随机数。不管映射是如何完成的--你可以使用模,除法,到浮点的转换,无论你能想出什么巫毒,基本问题仍然存在。

这个问题的规模很小,要求不高的应用程序通常可以忽略它。范围越小且RAND_MAX越大,则效果越不明显。

我以您的示例程序为例,对其进行了一些调整。首先,我创建了rand的特殊版本,它的范围仅为0-255,以更好地演示效果。我对rangerandomalg2做了一些调整。最后我将“球”的数量改为1000000以提高一致性。您可以在这里看到结果:http://ideone.com/4p4hy

int rangeRandomAlg2 (int min, int max)
{
    int n = max - min + 1;
    int remainder = RAND_MAX % n;
    int x;
    do
    {
        x = rand();
    } html" target="_blank">while (x >= RAND_MAX - remainder);
    return min + x % n;
}
 类似资料:
  • 比方说,如果我想在和之间生成一个无偏随机数,我会这样做: 但是,如果我想生成一个介于和之间的随机数,但更偏向于一个介于和之间的值的程度呢?最好用概率曲线来说明:

  • 返回指定范围内的随机整数。 使用 Math.random() 生成一个随机数并将其映射到所需的范围,使用 Math.floor() 使其成为一个整数。 const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; randomIntegerInRange(0, 5); /

  • 问题内容: 我知道如何在Python范围内生成随机数。 我知道我可以将其循环生成n个数量的这些数字 但是,我需要确保该列表中的每个数字都是唯一的。除了大量的条件语句之外,还有一种直接的方法可以生成n个唯一的随机数吗? 重要的是列表中的每个数字都不同。 所以 [12,5,6,1] =好 但 [12,5,5,1] =不好,因为数字5出现两次。 问题答案: 如果您只需要采样而无需更换: random.s

  • 本文向大家介绍C#产生一个随机整数,包括了C#产生一个随机整数的使用技巧和注意事项,需要的朋友参考一下 示例 本示例生成0到2147483647之间的随机值。            

  • 因此,我一直在寻找一个函数,该函数需要2个参数,一个低值和一个高值(均为64位整数),而不是在这些范围之间生成一个随机数。我一直遇到的问题是,这个数字不是64位int,或者边缘的数字比中间的数字更常见。 这是一些代码:它只是一直返回-1或0…

  • 我还没有找到一个函数来生成给定长度的随机浮点数数组。 我已经看过随机抽样,但似乎没有函数可以满足我的需求。 random.uniform很接近,但它只返回一个元素,而不是一个特定的数字。 这就是我所追求的: 这将返回一个由50个随机非唯一浮点数(即:允许重复)组成的数组,这些浮点数均匀分布在范围内。 有这样的功能吗