【问题标题】:Freezing time to get the same random outcome冻结时间以获得相同的随机结果
【发布时间】:2015-05-20 22:08:16
【问题描述】:

在大学学习第一门编程课程时,我们了解到将时间作为 rand 函数的种子值引入,以便在每次代码运行时给出随机值。如果我可以固定时间并玩一个每次你点击播放时都会给出随机级别的游戏,我会一直得到相同的级别吗?如果是的话,有没有办法做到这一点?

【问题讨论】:

  • 不要把时间当作种子。使用特定的种子而不是时间调用srand()
  • 是的,我问的是在我玩的特定游戏中使用它,我希望始终获得相同的水平,这是否可行?
  • @Barmar - 这可能还不够......您需要将时间设置为播种 PRNG 的确切时间。否则可能会有其他进程导致延迟
  • 当然,这只有在软件使用的时钟分辨率在秒范围内时才有效? (相关:stackoverflow.com/q/5574914/2564301,还有几十个类似的问题)比如这个应用的加载时间超过一秒,设置时钟就不行了。
  • 大多数游戏都足够智能,可以将“用户输入”添加到游戏开始的时间以及非常精确的播种计时器。这确保了这不能被轻易利用。不要在开始时播种,而是在第一次或第二次用户输入之后。

标签: c time


【解决方案1】:

如果游戏使用从运行时时间戳生成的伪随机数生成器,那么可以,如果您设法在每次游戏开始时将时间设置为相同的值,那么您应该获得相同的关卡。

可能的方法是拦截对 get system time 系统调用的调用,并将时间设置为当时的特定值,让其余部分保持不变。

您可以尝试使用 IDA Pro (https://www.hex-rays.com/products/ida/) 或其他一些反汇编器/调试器。我还发现这本书是关于使用 IDA Pro (http://www.amazon.com/Reversing-Secrets-Engineering-Eldad-Eilam/dp/0764574817) 进行hacking 的有趣读物

【讨论】:

  • 谢谢,您能给我一个链接吗,或者至少告诉我要搜索什么,以便了解有关如何执行此操作的更多信息?
  • 在 Unix 上,您可以使用 LD_PRELOAD 替换 time() 函数。
  • @PeterEmil 我添加了两个链接 - 一个指向 IDAPro 网站,另一个指向一本书,该书的编写类似于教程,解释如何使用 IDA 和 WinDBG 等工具来识别您想要的代码喜欢拦截以及如何修改它来做你想做的事
  • 或者只是传入一个设定值而不是使用时间。然后,您就完全控制了游戏的状态。
  • @MichaelDorgan:是的 - 修改原始可执行文件。在过去的 DOS 时代,让系统始终返回同一时间可能是可能的,但在 Windows 下,我不太确定这是否可行。
【解决方案2】:

我怀疑您不太可能以足够的粒度冻结时间,除非游戏被编码为使用秒而不是毫秒或微秒。要求它需要一个来自鼠标、磁盘、显示网络等的硬件中断,以使其具有不确定性。

不要作弊.... ;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多