我想生成特定范围内的随机数,例如“在 18 到 35 之间选择一个随机数”?我如何使用 rand()
函数做到这一点?
最佳答案
根据您使用的语言,内置的随机数生成器可能 已经具备这种能力 - 做更多的研究。
假设你的随机数生成器总是返回数字 在某个给定的范围内。只是为了争论,假设范围是 0..65536 但是 在您的示例中,您需要 Low..High, 18..35 范围内的随机数。
错误的做法是这样的:
r = (rand() % (High - Low + 1)) + Low
rand() 返回 0..65536 范围内的数字。除以后取余数 (High - Low + 1) 在这个例子中是 (35 - 18 + 1 = 18)。结果是介于 0..17。为此,您添加 Low (18),它将结果 r 移动到范围 18..35 中。范围 你正在寻找。
在使用除数的情况下,以这种方式生成的数字不会均匀分布 得到的余数不是返回的上限的偶数倍 兰德()函数。查看Fischer Yates Algorithm - Modulo Bias . 要消除这种偏差,您需要计算小于 rand() 返回值但除以 (High - Low + 1) 的最大数。 在您的情况下是 3640 * 18 = 65520。将其用作数字的高范围过滤器 由 rand() 返回为 如下:
do forever {
r = rand()
if r <= 65520 then {
r = (r % (High - Low + 1)) + Low
break
}
}
现在您生成的随机数应该具有与 rand() 相同的分布特征。
关于c - 如何使用 rand 函数使数字在特定范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4270382/