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



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

我正在与ANSI C合作,开发一个嵌入式32位ARM系统。我有一个寄存器,它生成一个随机的8位值(由芯片中的热噪声生成)。根据这个值,我想在一定范围内生成均匀分布的整数值,它们是:

0,1,2,3,4,5

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

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

RandomValue % SizeOfRange不会产生真正的随机值,因为通常情况下,将其分段为离散的可能值是不均匀的。

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

对于范围0..5,请查看最右边的3位。这将产生一个在0..7范围内的值。"重新滚动"结果为6或7。

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

作为一个真实的单词模拟,可以想象用一个6边骰子获得一个介于1和5之间的随机数。没有"公平"算法可以将一卷6映射为所需的数字1..5之一。只需重新滚动一个6,直到你得到想要的范围。

屏蔽高位可以确保"重新轮询"的数量最小。

一定要注意任何物理限制,即您可以提取特殊寄存器并期望获得完全随机值的频率。

最新更新