在 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)
生成从 lo
到 hi
的均匀分布的数字,转换 if(r>=rangemin) r+=rangesize
会工作得很好,不会弄乱分布。
相关链接:
关于c - 在没有循环的情况下生成范围外的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50978726/