【问题标题】:Generate next pseudo random value given a seed and offset给定种子和偏移量,生成下一个伪随机值
【发布时间】:2012-11-19 22:25:30
【问题描述】:

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

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

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

【问题讨论】:

  • 不,但是构造一个具有此属性的普通伪随机数生成器绝对是微不足道的。只需在种子和循环计数器上使用加密哈希函数。你是用 C 还是 C++ 编码?
  • 种子和循环是我能想到的,但如果你缓存你的结果,你就不必继续重新计算。如果您有一个实现,其中每个输出都是以下输出的有效种子,您将节省循环,但通常输出只是以下种子的一部分。
  • @David: C++ 但我相信界面在任何一种情况下都是相同的,我可以根据需要进行调整 - 因此两个标签。
  • @DavidSchwartz:您应该将其添加为答案。
  • @ezpz:您可以将 C++ 代码改编为 C 吗?我印象深刻。 (如果您认为没有区别,那么就没有必要或两者兼而有之。如果有相关的区别,同时说明两者会引起严重的混淆。)

标签: c++ c linux random


【解决方案1】:

glibc 中的随机数生成器是 Linear Congruential Generator,形式上的生成器 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))。要进行乘法逆运算,您只需使用扩展的欧几里得算法。后者只需执行一次。

【讨论】:

  • 你有代码吗?无法理解数学,但也许可以实现,或者至少复制粘贴它!或者你对这个主题有任何扩展的参考吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 2011-09-18
相关资源
最近更新 更多