我有一个随机数发生器,它在恒定时间内运行。范围内的恒定时间随机数
原型此功能如下:
uint8_t rand();
我希望能够做的就是创建一个随机返回一个uint8_t使得输出为0,最大值之间的函数,其中最大的是最大数量要退回。这种功能的原型将是:
uint8_t randi(uint8_t max);
有算法在线做这个和堆栈溢出。例如,https://stackoverflow.com/a/6852396/1444313。但我的问题是我想要在不变的时间内实现这一目标。我找不到在任何时间都能做到的任何方法。
此外,我在没有硬件划分的ARM Cortex-m0上运行,因此使用%运算符是不可能的。
有没有人有任何建议或指示我如何实现这一点在恒定时间?
感谢
我没有看到问题,任何远程合理的恒定长度整数的软件划分实现将具有恒定的时间复杂度。常数因子可能比替代品要高一些,其中最简单的解决方法是颠倒过程并乘以'max',然后除以常量'MAX'(如果需要,以uint64_t精度)。好处是,在最坏的情况下,由常量划分可以很容易地被优化成编译器的直接乘法/移位/添加序列,或者如果您不信任优化器,则可以通过手动优化。 – doynax
强制性xkcd链接:https:// xkcd。com/221/ – pmg
@doynax我不确定我是否从你的解释中理解了你的方法,如果你认为这可行,你能写一个答案吗?谢谢。 –