Eya*_*yal 3 c unix random prng
我正在使用srandom()和random()在Unix系统上生成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
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?有时RNG会分叉到不同的线程中,我也需要在创建新线程时复制RNG的状态.
使用erand48()/ nrand48()/jrand48()分别生成双精度浮点,非负长整数或有符号长整数随机数.这些函数允许您根据需要拥有尽可能多的独立序列; 状态作为参数传递,可以轻松保存和恢复.此外,序列由标准定义,并且即使在不同平台上也不会在运行中变化.
其他一些答案表明rand_r().此函数在POSIX.1-2008中已过时,其中包含以下注释:
该
drand48()函数提供了更精细的随机数生成器.对一个函数调用与另一个函数调用之间可以携带的状态量的限制意味着该
rand_r()函数永远不能以满足伪随机数生成器的所有要求的方式实现.因此,只要满足非平凡的要求(包括安全性),就应该避免这种功能.该
rand_r()功能可能会在将来的版本中删除.