【问题标题】:Random Number Generator that Allows "Indexing"允许“索引”的随机数生成器
【发布时间】:2014-02-22 23:45:54
【问题描述】:

我希望这不是一个太明显的问题:是否存在不依赖于先前返回值的随机数生成算法,以便我可以(例如)获得序列中的第 50 个数字,而无需计算前面的 49 ?

原因是我正在制作具有持久性的 roguelike(这样我就可以从同一个种子中重新创建完全相同的关卡),但是为了计算每个关卡的某些特征,我不想“计算” ” 所有以前的功能只是为了让随机数生成器处于正确的“状态”,例如到目前为止已经使用了 100 次。我希望能够在不确定先前值的情况下查询第 101 个随机数,以便程序可以单独创建关卡特征。

【问题讨论】:

  • 好的 RNG 允许您查询它们的当前状态/种子。

标签: algorithm random


【解决方案1】:

您可以使用任何密码加密普通序列号 [1..N], 并通过这种方式 - 为每个 SeqNo 生成唯一的伪随机值。

【讨论】:

  • 您建议使用哪种加密方法以使数字显得随机?
  • 如果您需要严格唯一的输出编号 - 我建议您使用真正的密码,例如单块 AES。否则,如果接受小的冲突概率(当一对序列号生成相同的输出时) - 您可以使用 MD5 或 SHA1 或 SHA3 哈希。
【解决方案2】:

如果您使用linear congruential random number generator,计算从给定种子生成的第 $n$ 个元素是很简单的。但将状态隐藏在游戏的“有趣”点可能更容易。

OTOH,如果您想在某个时间点“重新启动”游戏,您可能希望能够重新创建地牢的功能,但是(由于不同的玩家操作)RNG 的使用会从那时起有所不同.即,如果从同一点开始,如果我向怪物射击两次,RNG 的使用次数将比我逃跑的次数多;生成的下一个项目将获得不同的值。也许您真正想要的是几个独立的随机数流,并根据需要保存状态?

周围有很多 roguelike 游戏,主要是开源的。有些是有限的/很小的(来自“在一天内构建一个游戏”之类的比赛),并且可能为您提供一个很好的起点。为什么要自己创建,而不是破解现有的?

【讨论】:

  • 线性同余RNG看起来不错;稍后我需要对此进行更多研究。感谢您的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2019-03-04
  • 2023-01-03
  • 2020-08-20
  • 1970-01-01
相关资源
最近更新 更多