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

标签 c random

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

我正在嵌入式 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/

相关文章:

Javascript背景根据函数变化

java - Java中随机生成器的问题

r - 根据面板数据中的索引分块抽样

c - 查找未运行的网络接口(interface)

c++ - 在 C89 和 C++ 中用空参数调用宏真的是未定义的行为吗?

c - 如何向 ISO 技术委员会提交变更或要求澄清

c - 反转字符串中的单词

c - 重新分配字符串数组

SQL - 生成具有特定格式的字母数字字符串

c++ - 如何在另一种语言的随机函数中复制 C++ rand?