5

我知道我可以通过使用种子调用来“重新启动”我rand的调用srand,但这肯定会影响未来对rand其他库方法的调用,包括加密方法?

如何在某些地方重复我的随机性并仍然确保我的其余代码不受影响?

4

6 回答 6

2

(Ruby 1.9.2)您可以序列化一个随机生成器,将其存储在一个文件中,并将该文件与您的程序一起提供。

创建文件:

File.open('random_generator.marshal', 'w'){ |f| Marshal.dump(Random.new, f) }

在程序中使用随机生成器:

f = File.open( 'random_generator.marshal', 'r' )
r = Marshal.load( f )
f.close

10.times{ puts r.rand } #repeatable
于 2010-10-29T19:32:25.973 回答
1

使用简单随机gem。

于 2010-10-29T17:01:05.453 回答
1

(在 ruby​​ 1.9.3 中)有一个更简单的解决方案使用Random.

您需要使用r = Random.new(seed)来获取可用于生成随机调用的对象r.rand。这是可重复的,只会影响对r.randnot的调用Kernel.rand

于 2012-05-21T14:21:09.397 回答
0

兰德():

...Kernel::srand 可用于确保程序不同运行之间随机数的可重复序列...。

srand():

将伪随机数生成器播种到 number.to_i.abs 的值。...通过将种子设置为已知值,可以在测试期间使脚本具有确定性...。

您可以存储您的种子值和用户进行的迭代次数,然后在稍后使用该值重新设置种子,然后循环他们之前使用它的次数以跳过以前的值,然后登陆您在序列中的下一个值。这是我所知道的尝试恢复序列的唯一方法。如果您担心其他例程/线程,请在设置 srand 之前获取原始种子并将其存储,获取下一个数字,然后恢复原始种子。

如果您担心影响依赖它的其他例程的随机性,我认为这些例程的作者应该做一些事情来确保他们处理的是真正的随机种子。你真的只能关心你的代码而不是杀死系统。除此之外,责任就变成了他们的。

于 2010-10-30T00:07:02.427 回答
0

好吧,您可以实现自己的不使用系统版本的 PRNG。有很多关于如何做到这一点的文献,从最简单的线性同余梅森捻线器

事实上,由于 Ruby 是开源的,您实际上可以偷看(请参阅参考资料random.c)它如何处理随机数并使用与系统版本分开的信息重新实现它。

于 2010-10-29T16:40:18.890 回答
-1

如果您使用的是 JRuby,则只需实例化一个java.util.Random.

于 2010-10-29T16:55:15.000 回答