我在 Unix 系统上使用 srandom() 和 random() 在 c 中生成随机数。我想要多个 RNG。给定相同的种子,每个都应该输出相同的序列。我还想保存并恢复每一个的状态。这是一个伪代码示例:

R1 = new_rng(5); //5 is the seed
R2 = new rng(5); //5 is the seed here, too.
a = R1.random();
b = R1.random();
d = R2.random(); //a == d
s1 = R2.get_state(); //save the state of R2
e = R2.random(); //b == e
R2.set_state(s1); //restore the state of R2
f = R2.random(); //b == f

我该怎么做呢?有时,RNG 会分叉到不同的线程中,我也需要在创建新线程时复制 RNG 的状态。

有帮助吗?

解决方案

使用 erand48() / nrand48() / jrand48() 以产生双精度浮点,非负长整数或符号长整型随机数,分别。这些功能让你有尽可能多的独立序列所需;状态被传递作为参数,并可以很容易地保存和恢复。此外,该序列是由标准定义,并且跨越运行不会发生变化,甚至在不同的平台。

一些其他的答案提示 rand_r() 。此功能是过时在POSIX.1-2008,其中包含本说明:

  

drand48()函数提供了更复杂的随机数发生器。

     

上可以一个函数调用之间并进行另一意味着rand_r()功能永远不能满足所有的上一个伪随机数发生器的要求的方式来实现的状态的量的限制。因此应避免使用此功能,每当非平凡要求(包括安全)已被满足。

     

rand_r()功能可能在将来的版本中删除。

scroll top