正如标题所述,我在Freescale Coldfire芯片上使用了一个随机数生成器,它返回一个32位的无符号值。据我所知,没有办法配置生成器来限制范围。在接受的范围内操纵数字的最佳方法是什么?
我正在考虑用高范围值来调整这个数字,但我仍然需要处理下界。
发布于 2013-12-07 22:01:54
是的,传统的方法是按范围进行MOD,这对于许多普通用途(模拟卡片、骰子等)来说都很好。如果范围很小(与你的发电机的32位范围相比,52的范围相当小)。这仍然是有偏见的,但这种偏见几乎是不可能被发现的。如果你的范围越大,偏差就会越大。例如,如果你想要一个随机的9位数的数字,这种偏见将是可怕的。如果你想要完全消除偏见,没有其他选择,只有做拒绝抽样-也就是说,你必须有一个循环,在其中你产生随机数,并扔掉一些。如果你做得对,你可以将所需的额外数字保持在最低限度,这样你就不会放慢速度。
发布于 2013-12-07 03:58:03
这篇C FAQ文章怎样才能得到一定范围内的随机整数?解释了如何正确地在范围[M,N]中生成随机数,您应该使用的公式是:
M + (random number) / (RAND_MAX / (N - M + 1) + 1)发布于 2013-12-07 03:59:55
Stephan T. Lavavej解释了为什么这样做不会那么好:
从2013年土生土长- rand()被认为有害
如果你真的关心均匀的分配,坚持2的力量,或找到一些日常的抖动。
https://stackoverflow.com/questions/20437378
复制相似问题