我看了看我找到的其他答案,但它们似乎不适合我的情况。
我正在与ANSI C合作,在嵌入式32位ARM系统上工作。我有一个寄存器,它产生一个随机的8位值(由芯片中的热噪声产生)。从该值中,我想在某些范围内生成均匀分布的整数值,这些值是:
0,1,2,3,4,5
0,1,2,3,4,5,6,7,8 9
“真”的随机性在我的应用中是非常重要的,我需要产生能使测量漂移的白噪声。谢谢!
发布于 2014-10-21 18:11:09
取RandomValue % SizeOfRange不会产生真正的随机值,因为通常情况下,进入离散的可能值是不均匀的。
我建议使用比特掩码来忽略感兴趣范围之外的所有比特,然后反复获得一个新的随机数,直到蒙面值降到所需的范围内为止。
对于范围0..5,请看最右边的3位。这将在0.7范围内产生一个值。“重播”结果为6或7。
对于范围0..9,请看最右边的5位。范围是0..16。忽略10.16的结果。
作为一个真实的词模拟,想得到一个随机数之间的1和5之间的一个6边的模具。没有“公平”的算法将6的滚动映射到所需的数字1..5中。只需重新分配一个6,直到你得到了想要的范围。
掩蔽高比特可以确保"rerolls“的数量是最小的。
一定要注意任何物理限制,你可以每隔多长时间提取一次特殊寄存器,并期望得到一个完全随机的值。
https://stackoverflow.com/questions/26493277
复制相似问题