给定种子和偏移量,生成下一个伪随机值

时间:2012-11-19 22:25:30

标签: c++ c linux random

对于rand的给定实现,是否有可能在给定初始种子和到目前为止rand的调用次数的情况下有效地生成序列中的下一个数字?

我想要的是使用rand为模拟中的节点提供时间偏移。每个节点将使用它的唯一ID播种,并使用rand的输出在模拟中提供延迟抖动。我希望每个节点能够计算任何其他节点测量冲突的下一个延迟。我可以访问任何节点的初始种子以及调用rand的次数。

我想避免播种和循环n + 1次以获得下一个值。我想要的是rand的通用linux实现吗?

1 个答案:

答案 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(数字))。要采用乘法逆,您只需使用扩展的欧几里德算法。你只需要做一次。