0

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

我正在考虑通过高范围值修改数字,但我仍然必须处理下限。

4

3 回答 3

2

这篇C 常见问题解答文章How can I get random integers in a certain range? 解释了如何正确生成范围内的随机数,[M,N]基本上你应该使用的公式是:

M + (random number) / (RAND_MAX / (N - M + 1) + 1)
于 2013-12-07T03:58:03.107 回答
1

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

从 Going Native 2013 - rand() 被认为是有害的

如果您真的关心均匀分布,请坚持使用 2 的幂,或者找到一些抖动的例程。

于 2013-12-07T03:59:55.470 回答
0

是的,传统的方法是按范围进行 MOD,如果范围非常小(与您的 32 位范围相比,范围为 52发电机很小)。这仍然会有偏差,但几乎不可能检测到偏差。如果你的范围更大,偏差就会更大。例如,如果你想要一个随机的 9 位数字,偏差将是可怕的。如果你想完全消除偏差,除了做拒绝抽样之外别无选择——也就是说,你必须有一个循环来生成随机数并丢弃一些。如果你做得对,你可以将所需的额外数字保持在最低限度,这样你就不会减慢速度。

于 2013-12-07T22:01:54.460 回答