对于rand
的给定实现,是否有可能在给定初始种子和到目前为止rand
的调用次数的情况下有效地生成序列中的下一个数字?
我想要的是使用rand
为模拟中的节点提供时间偏移。每个节点将使用它的唯一ID播种,并使用rand
的输出在模拟中提供延迟抖动。我希望每个节点能够计算任何其他节点测量冲突的下一个延迟。我可以访问任何节点的初始种子以及调用rand
的次数。
我想避免播种和循环n + 1
次以获得下一个值。我想要的是rand
的通用linux实现吗?
答案 0 :(得分:0)
glibc中的随机数生成器是一个线性同余生成器,是表单上的生成器 x_ {n + 1} = a * x_ {n} + b mod m。为了正确选择a,b和m,它可能就足够了。两种或两种以上的组合可以提高质量。
以这样的顺序向前跳是相当容易的。 x_ {n + k} = a ^ {k} * x_ {n} + b *(a ^ {k} -1)/(a-1)mod m。 将数字增加到幂mod m在数字中的位数是线性的,即O(log(数字))。要采用乘法逆,您只需使用扩展的欧几里德算法。你只需要做一次。