如何在一个区间内生成一个整数随机值,从随机字节开始

时间:2014-10-21 18:04:29

标签: c random

我查看了我找到的其他答案,但它们似乎不适合我的情况。

我在ANSI C上使用嵌入式32位ARM系统。 我有一个寄存器,可以生成一个随机的8位值(由芯片中的热噪声产生)。从该值我想在一定范围内生成均匀分布的整数值,它们是:

0,1,2,3,4,5

0,1,2,3,4,5,6,7,8,9

"真"随机性在我的应用中非常重要,我需要产生可能使测量漂移的白噪声。 谢谢!

1 个答案:

答案 0 :(得分:2)

RandomValue % SizeOfRange不会产生真正的随机值,因为通常会对不连续的可能值进行分组。

我建议使用位掩码忽略感兴趣范围之外的所有位,然后重复获取一个新的随机数,直到屏蔽值落在所需范围内。

对于范围0..5,请查看最右侧的3位。这将产生0..7范围内的值。 "再轧"结果为6或7。

对于0..9的范围,请查看最右边的5位。范围是0..16。忽略10..16的结果。

作为一个真实的单词模拟,考虑尝试使用6面模具获得1到5之间的随机数。没有"公平"将一卷6映射到所需数字1..5之一的算法。只需重新打印6即可获得所需范围内的内容。

屏蔽高位可确保"重新输入"是最小的。

请务必注意任何物理限制,即您可以拉出特殊寄存器的频率,并希望获得完全随机的值。