我查看了找到的其他答案,但它们似乎不适合我的情况。
我正在嵌入式 32 位 ARM 系统上使用 ANSI C。 我有一个寄存器,可以生成随机 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 之一。只需重新 throw 6,直到获得所需范围内的数值。
屏蔽高位可确保“重新滚动”的次数最少。
请务必注意拉取特殊寄存器的频率的任何物理限制,并期望获得完全随机的值。
关于c - 如何从随机字节开始生成一个区间内的整数随机值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26493277/