c - 如何使用 rand 函数使数字在特定范围内?

标签 c function random

我想生成特定范围内的随机数,例如“在 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/

相关文章:

javascript - 为什么我的购物车总计无法使用 onclick 和toggle 工作?

r - 在每行中生成介于 1 和列中特定值之间的随机数

c - 如何确定 float 尾数的最大正基数 10 值?

c - 双向链表快速排序 C

c - 使用 TDD 的 Hello world 和使用 Eclipse CDT + Jenkins + Maven 的持续集成

c - return 是运算符还是函数?

Javascript 立即函数和代码范围

C89:使用 rand_r() 的多线程随机值

javascript - math.floor 和 math.radom 相差一个索引

c - scanf()、sscanf() 或 fscanf() 中的 %[] 或 %[^] 说明符是否将输入存储在以 null 结尾的字符数组中?