C 使用rand()时输出范围内的随机数

C 使用rand()时输出范围内的随机数,c,random,C,Random,我的具体问题是,当我输入一个范围,比如90作为下限值,100作为上限值时,我得到的输出随机数有时小于90。在我下面的代码中,x编辑: 应该是: if (x == y) a = x else a = (rand() % (y - x)) + x 编辑: 应该是: if (x == y) a = x else a = (rand() % (y - x)) + x 假设您想要独占上限,正确的方法是: (rand() % (high - low)) + low 假设high=100和low=90,

我的具体问题是,当我输入一个范围,比如90作为下限值,100作为上限值时,我得到的输出随机数有时小于90。
在我下面的代码中,x编辑:
应该是:

if (x == y) a = x
else a = (rand() % (y - x)) + x
编辑: 应该是:

if (x == y) a = x
else a = (rand() % (y - x)) + x

假设您想要独占上限,正确的方法是:

(rand() % (high - low)) + low
假设high=100和low=90,了解其工作原理:

  • 生成一个随机整数
  • (高-低)为您提供范围,100-90=10
  • 当你用10%进行计算时,你将得到一个范围为[0,10]的结果,因此它将是0,1,2,3,4,5,6,7,8或9中的一个
  • 因为你真正想要的是90,91,92,…,99中的一个,所以你必须把
    低的
    加回去
这里需要注意的是,您将只得到[90,99]。如果您希望有一个包含的上限,因此[90,100],那么您希望在您要修改的金额中添加1

(rand() % (high + 1 - low)) + low

假设您想要独占上限,正确的方法是:

(rand() % (high - low)) + low
假设high=100和low=90,了解其工作原理:

  • 生成一个随机整数
  • (高-低)为您提供范围,100-90=10
  • 当你用10%进行计算时,你将得到一个范围为[0,10]的结果,因此它将是0,1,2,3,4,5,6,7,8或9中的一个
  • 因为你真正想要的是90,91,92,…,99中的一个,所以你必须把
    低的
    加回去
这里需要注意的是,您将只得到[90,99]。如果您希望有一个包含的上限,因此[90,100],那么您希望在您要修改的金额中添加1

(rand() % (high + 1 - low)) + low

您必须将此公式用于y独占(a in[x,y[):

对于y(包括[x,y]中的a),这一个是:


您必须将此公式用于y独占(a in[x,y[):

对于y(包括[x,y]中的a),这一个是:


假设你想要一个实际的随机分布。。。 伪码

range = high - low
r = rand()
while (r > range)
{
    r=rand();
}
r+=low;
类似的东西应该通过拒绝超出范围的东西来给你一个统一的分布,因为使用
mod n
在rand的域上n的所有值都没有统一的分布(
0
rand\u MAX
,在我的C库上是
0x7fffff

让我们使用人为的0xf示例作为域:

如果对范围内的每个值执行
rand()%10
。。。 然后你会得到: 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5。其中0,1,2,3,4,5的数量等于6,7,7,8,9

通过进入一个更大的域,你可以得到更平滑的分布,但是如果你不使用RAND_MAX+1的清晰划分来进行修改,它将永远是块状的


根据您正在处理的数字以及rand的速度,您可以执行上述简单化的操作,或者您可以丢弃大于被除数干净除的最大数字的内容……因此,如果您要除以10以消除偏差,请丢弃0x7FFFFFF8上的所有内容。

假设您想要实际的随机分布。。。 伪码

range = high - low
r = rand()
while (r > range)
{
    r=rand();
}
r+=low;
类似的东西应该通过拒绝超出范围的东西来给你一个统一的分布,因为使用
mod n
在rand的域上n的所有值都没有统一的分布(
0
rand\u MAX
,在我的C库上是
0x7fffff

让我们使用人为的0xf示例作为域:

如果对范围内的每个值执行
rand()%10
。。。 然后你会得到: 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5。其中0,1,2,3,4,5的数量等于6,7,7,8,9

通过进入一个更大的域,你可以得到更平滑的分布,但是如果你不使用RAND_MAX+1的清晰划分来进行修改,它将永远是块状的


根据您正在处理的数字以及rand的速度,您可以执行上述简单化的操作,或者您可以丢弃被除数完全除掉的最大数字以上的内容……因此,如果您要除以10以消除偏差,请丢弃0x7FFFFFFFF8上的所有内容。

(rand()%(高-低))+low
谢谢你的帮助,谢谢。可能重复的
(rand()%(high-low))+low
谢谢你的帮助,谢谢。陷阱可能重复:当
x==y
时。应该是
a=(rand()%(y-x+1))+x
你的意思是
如果(x==y)a=x;
?陷阱:当
x==y
时,陷阱应该是
a=(rand()%(y-x+1))+x
你的意思是
如果(x==y)a=x;