保存/恢复Ruby的随机

时间:2015-09-07 04:28:13

标签: ruby random

我试图创建一个游戏,我希望在相同种子的情况下始终运行相同的游戏。这意味着对于使用相同种子的两个玩家来说,随机事件 - 无论他们可能是什么 - 将始终是相同的。 但是,考虑到用户保存和加载游戏的能力,每次加载保存时Ruby都会重置,如果两个玩家在不同点保存和加载,则整个原则无效。

我想象的唯一解决方案是,无论何时加载保存文件,都要生成与之前相同数量的点,从而使Ruby的Random变为与加载前相同的状态。但是,要做到这一点,我需要对其进行扩展,以便每次生成随机数时都会更新计数器。

有没有人知道如何做到这一点或有更好的方法来恢复Ruby的随机状态?

PS:我不能使用Random(Random.new)和Marshall的实例。我必须使用Ruby的默认设置。

3 个答案:

答案 0 :(得分:1)

Marshal.dump/Marshal.load之类的声音可能就是您想要的。 Randomdocumentation明确指出"随机对象可以被编组,允许保存和恢复序列。"

您可能仍然遇到跨游戏同步的问题,因为不同的基于用户的决策可以带您通过不同的逻辑路径,从而以完全不同的方式使用随机数序列。

答案 1 :(得分:0)

我建议可以保存当前的'用户决定保存(或程序关闭时)的数据到文件,具体取决于您的喜好。

这可以使用ruby中的File类来完成。

这意味着您需要跟踪转弯并将其与保存数据一起传递。或者你可以循环浏览文件中的数据,并找出我想要的转弯次数。

所以你有类似的东西:

def loadGame(loadFile)

    loadFile.open
    data = loadFile.read
    # What you do below here depends on how you decide to store the data in saveGame.

end

def saveGame(saveFile)

    saveFile.open
    saveFile.puts data
end

还没有真正尝试过上面的代码,所以它可能是错误的语法等。它主要是我想要碰到的概念。

希望有帮助吗?

答案 2 :(得分:0)

有许多生成器仅根据前一个值计算序列中的每个随机数,因此如果您使用其中一个,则只需将最后一个随机数保存为游戏状态的一部分。一个示例是基本linear congruential generator,其格式为:

z(n+1) = (az(n) + b) mod c

其中abc通常是大(已知)常量,z(0)是种子。

一个可以说是更好的是所谓的" mulitply-with-carry"方法