Ruby 1.9.2 中的分布式顺序随机数生成

发布于 2024-09-16 10:43:15 字数 487 浏览 4 评论 0原文

Ruby 1.9.2 中的 Random 类保证在给定特定种子和范围的情况下以相同顺序生成随机数。例如:

r = Random.new(23)
r.rand(100)         # 83
r.rand(100)         # 40

但是假设我想在另一台计算机上生成序列中的下一个数字(而不重新生成序列中较早的数字)。鉴于之前的输出,这应该是可能的。有没有办法使用 Random 类来做到这一点?或者我是否必须编写自己的 梅森扭曲器 的实现?

[编辑:正如下面的评论所指出的,实际上不可能仅从输出中确定Random实例的状态,因为只有部分状态(具体来说,低 32 位)用于输出。]

The Random class in Ruby 1.9.2 is guaranteed to generate random numbers in the same order, given a particular seed and range. For instance:

r = Random.new(23)
r.rand(100)         # 83
r.rand(100)         # 40

But suppose I want to generate the next number in the sequence on another computer (without re-generating the earlier numbers in the sequence). This should be possible, given the previous output. Is there a way to do this with the Random class? Or do I have to write my own implementation of the Mersenne twister?

[Edit: As pointed out in the comments below, it is not in fact possible to determine the state of a Random instance just from the output, because only part of the state (specifically, the low 32 bits) are used for the output.]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦里的微风 2024-09-23 10:43:15

无法测试,但可以根据 Marc-André Lafortune 的说法对生成器进行编组 这里
所以这可能有效:

r = Random.new(23)
r.rand(100)         # 83
r.rand(100)         # 40

File.open("/path/to/file","w") do |f|
  Marshal.dump(r,f)
end

# later, may be on another computer

File.open("/path/to/file","r") do |f|
  @v = Marshal.load(f)
end

puts @v.rand(100)

Can't test, but the generator can be marshalled, according to Marc-André Lafortune here.
So this might work:

r = Random.new(23)
r.rand(100)         # 83
r.rand(100)         # 40

File.open("/path/to/file","w") do |f|
  Marshal.dump(r,f)
end

# later, may be on another computer

File.open("/path/to/file","r") do |f|
  @v = Marshal.load(f)
end

puts @v.rand(100)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文