c-给定一个32位无符号的ran num,如何操作某个范围[低,高]内的值



正如标题所说,我在Freescale Coldfire芯片上使用随机数生成器,它返回一个32位无符号值。据我所知,没有办法配置生成器来限制范围。将数字控制在可接受范围内的最佳方法是什么?

我想用高范围值来修改这个数字,但我仍然需要处理下限。

这篇C常见问题解答文章如何获得特定范围内的随机整数?解释了如何正确生成[M,N]范围内的随机数,基本上你应该使用的公式是:

M + (random number) / (RAND_MAX / (N - M + 1) + 1)

Stephan T.Lavavej解释了为什么这样做仍然不会那么好:

从走向本土2013-rand()被认为有害

如果你真的关心均匀分布,坚持2的幂,或者找到一些抖音的例程。

是的,传统的方法是按范围进行MOD,如果范围很小(与生成器的32位范围相比,52的范围很小),这对于许多普通用途(模拟纸牌、骰子等)来说都很好。这仍然是有偏见的,但这种偏见几乎不可能被检测到。如果你的范围越大,偏差就会越大。例如,如果你想要一个随机的9位数字,那么偏差将是可怕的。如果你想完全消除偏差,别无选择,只能进行拒绝采样——也就是说,你必须有一个循环,在这个循环中你生成随机数并丢弃一些。如果你做得对,你可以把所需的额外数字降到最低,这样你就不会放慢速度。

最新更新