c - 在没有循环的情况下生成范围外的随机数

标签 c random

在 C 中,我可以使用这个简单的表达式来生成一个范围内的随机数:

rand() % (max_number + 1 - minimum_number) + minimum_number

是否有类似的非循环表达式可以生成范围外的随机数?例如,如果我的范围是从 3 到 5,我会想要一个介于 0 到 2 或 6 到 RAND_MAX 范围内的随机数。

最佳答案

这会起作用:

int r = rand() % (maxval+1 - rangesize);
if(r>=rangemin)
    r+=rangesize;

在您的示例中,rangesize 将为 3,因为您要避免的范围内有三个数字,而 rangemin 将为 3,因为它是范围内的最小数字那个范围。

这将产生 [0, maxval] 范围内的随机数,[rangemin, rangemin+rangesize-1] 范围内的数字除外

但是,请注意,使用 rand() % x 通常会产生不良分布,因此如果这很重要,您需要考虑一下。感谢 rici 指出这一点。有关此的更多信息,请参阅他的回答。

但假设您有一个函数 r(lo, hi) 生成从 lohi 的均匀分布的数字,转换 if(r>=rangemin) r+=rangesize 会工作得很好,不会弄乱分布。

相关链接:

Generating a uniform distribution of INTEGERS in C

http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx

关于c - 在没有循环的情况下生成范围外的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50978726/

相关文章:

css - 语法错误 : error evaluating function `unit` : the first argument to unit must be a number

php - 在 PHP 中获取随机 boolean 值 true/false

c - 将结构体传递给线程的简单解释

c - 如何为结构数组中的 char 字符串分配内存?

javascript - 无背靠背随机报价

python - 如何随机选择列表中的值?

c - 生成具有特定约束的随机位模式

c - 如何在 C 中打印空数组元素/跳过数组元素?

python - 我可以打包 cpython 吗?

C 文件读取,空白/空行