【问题标题】:Generating 'random' numbers from time?从时间产生“随机”数字?
【发布时间】:2018-06-04 10:16:49
【问题描述】:

我已经阅读了许多随机数生成器以及大多数问题(可重复、非均匀分布、浮点精度、w/e 模数)的所有问题。

我是一名游戏开发者,我在想为什么不从时间生成“随机”数字?我知道它们不会是“随机的”,但至少它们是无法预测的,我很高兴他们只是对玩家感到随机。

例如,假设在每一帧,我们可以从当前时间中取出 5 位数字,并使用它们来生成随机数。 假设我们将时间作为浮点数 ss.mmmuuunnn 其中 ss = 秒,mmm = 毫秒,uuu = 微秒和 nnn = 纳秒,我们可以只取 muuun 部分并使用它来生成我们自己的随机数。我对它们进行了一些调查,它们看起来和感觉都很随意。我可以想出很多公式来处理这 5 个数字并得到新的数字。

这里有人看到任何错误或表现不佳吗? 提醒一下,我只是在寻找一种简单的方法来生成“感觉”随机分布且不可预测的数字。

这是给玩家随机感的简单而体面的方式吗?

【问题讨论】:

  • 如果你想要极快、不太明显可预测的数字,你可以试试DOOM approach。老实说,查找当前时间的系统调用到底有多快?从那时起使用某种 PRNG seed 但将状态保存在您自己的内存中可能要快得多。 linear congruential generator 的“随机性”很差,但状态很少而且速度很快。
  • 我不相信这里存在开箱即用的伪随机数生成器无法解决的问题。
  • 顺便说一句,你有同样的模数问题。常规 PRNG 有什么问题?
  • 有趣的是,实际上随机数(或任何至少有点接近的东西)通常不会让人感觉特别随机,例如,重复的概率感觉“太高”。
  • srand(time(NULL)) 是样板,Google 有 310,000 次点击:)

标签: c++ c random time


【解决方案1】:

为了论证,我们假设您平均每 0.1 毫秒调用一次随机函数(因为您需要它快速,所以您经常调用它,对吗?)并且它同样可能落入该时间范围内的任何地方。换句话说,uun 部分被假定为完全随机的,但所有更高的部分只会随着调用而缓慢变化,因此大部分是可预测的。

这是 1000 个可能的结果或约 10 位随机性。有1,056,964,608 normal floats bewteen 0 and 1 - 当然分布不均。那是三个数量级以上,这对我来说听起来像是“随机性差”。同样,将您的 10 位扩展到 int 的 32 位(无论您的函数多么花哨)实际上不会提高随机性。

另请注意,这些都不涉及您的调用可能非常周期性和/或序列很短的可能性(并且很可能是这种情况),以及您的系统时间函数可能没有足够高的分辨率这一事实(或significantly increase power consumption of the system)。两者都进一步降低了获取时间的随机性,而后者的副作用可能是非常不可取的。

提醒,我只是在寻找一种简单的方法来生成“感觉”随机分布且不可预测的数字。

这是非常不具体的。人类在判断随机性方面很糟糕,并且可能会“感觉”接近均匀的分布比真正的完全随机分布更随机——尤其是在条纹方面。

不可预测性也存在于太多的关卡中,从“玩家无法手动预测敌人会做什么”到“密码安全直到时间结束”。例如,鉴于上述假设,有可能预测两个随机调用中的第二个的结果,这两个随机调用快速连续发生,成功率从 0.1% 到 100% 不等。这种模式是如何在游戏中出现的很难说,但人类非常擅长发现模式。

【讨论】:

  • “但人类非常擅长发现模式。” -- 即使他们不在。
猜你喜欢
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
相关资源
最近更新 更多