【发布时间】:2017-03-17 17:29:56
【问题描述】:
我有一个以恒定时间运行的随机数生成器。
这个函数的原型如下:
uint8_t rand();
我想要做的是创建一个随机返回 uint8_t 的函数,使得输出介于 0 和 max 之间,其中 max 是要返回的最大数字。这种函数的原型是:
uint8_t randi(uint8_t max);
有在线算法可以做到这一点,并且在堆栈溢出时。例如,https://stackoverflow.com/a/6852396/1444313。但我的问题是我想在恒定时间内实现这一目标。我找不到任何可以在恒定时间内执行此操作的方法。
此外,我在没有硬件划分的 ARM Cortex-m0 上运行,因此无法使用 % 运算符。
有人对我如何在恒定时间内实现这一目标有任何建议或指示吗?
谢谢
【问题讨论】:
-
我看不出问题,任何远程合理的定长整数软件除法实现都将具有恒定的时间复杂度。常数因子可能比替代因子高一点,其中最简单的解决方案是反转过程并乘以
max,然后除以常数MAX(如果需要,以 uint64_t 精度)。优点是,在最坏的情况下,编译器可以轻松地将除以常数优化为直接的乘法/移位/加法序列,或者如果您不信任优化器,则可以手动优化。 -
强制 xkcd 链接:xkcd.com/221
-
@doynax 我不确定我是否从你的解释中理解了你的方法,如果你认为这可行,你能写一个答案吗?谢谢。
-
“我在没有硬件划分的 ARM Cortex-m0 上运行,因此无法使用 % 运算符。”暗示
/也不可用(由于非恒定时间)。是这样吗? -
我怀疑答案是不可能的,但可能会有非常小的时间差异。这变成了一个问题,您需要绝对意义上的恒定时间还是实际意义上的几乎恒定时间?只是一些奇怪的随机想法。