【发布时间】:2018-06-21 23:27:58
【问题描述】:
在 C 中,我可以使用这个简单的表达式来生成一个范围内的随机数:
rand() % (max_number + 1 - minimum_number) + minimum_number
是否有类似的、非基于循环的表达式可以生成范围外的随机数?例如,如果我的范围是 3 到 5,我想要一个介于 0 到 2 或 6 到 RAND_MAX 范围内的随机数。
【问题讨论】:
-
是的,你可以!提示:使用无符号。 (除了
rand()% something会有偏见) -
你可以这样做,但如果你的范围与
RAND_MAX相比很小,那么你的结果将有很大的偏差,纠正这种偏差的常用方法是使用循环。 (如果你的范围,通过循环的预期行程次数也会很小。) -
关于偏见和拒绝抽样的有趣博文:dimitri.xyz/random-ints-from-random-bits
-
请注意,
RAND_MAX依赖于实现,仅保证为 32767。因此,如果您的max_number和minimum_number是不受限制的 32 或 64 位数字,您将需要更复杂的解决方案来生成数字,然后将其调整为超出您的范围。 -
把数字的范围想象成一个封闭的圆圈。现在排除一个范围的问题和在一个范围内查找数字的问题是一样的。