对于给定的rand
实现,是否有可能在给定初始种子和迄今为止对rand
的调用次数的情况下,高效地生成序列中的下一个数字?
我想要使用rand
为模拟中的节点提供时间偏移。每个节点都将使用其唯一的ID作为种子,并使用rand
的输出来提供仿真延迟中的抖动。我希望每个节点都能够为其他任何节点计算冲突的下一个延迟。我可以访问任何节点的初始种子,并且已调用rand
的次数。
我想避免播种和循环n + 1
时间来获取下一个值。使用rand
的通用linux实现,我什至想得到什么?
最佳答案
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(number))。要使用乘法逆,只需使用扩展的欧几里得算法即可。您只需要做一次。
关于c++ - 给定种子和偏移量,生成下一个伪随机值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13463411/