我最新的项目是基于文本的RPG的开发,现在我需要一个随机数生成器,一个很好的计算器,可以在不同的情况下计算是否可以执行某些操作而不会出现问题。我们每个人都知道,基本函数std::srand
和std::rand
是计算伪随机值的简单而简单的算法。但是我希望有真实值而不是伪值。因此,我想问一下,使用比上述解决方案更好的解决方案是否会过分夸大并坚持基础;如果没有,你会建议什么?如何实现这样一个“好的发电机”?
答案 0 :(得分:7)
我的建议是使用Boost.Random。它有一个number of quite good (and fast) RNGs。您不需要加密安全的,但它们提供的优于rand
。
我自己去mt19937。它有很长的一段时间,速度非常快。但是对于大多数非加密安全需求,Boost.Random有很多这些东西。
答案 1 :(得分:3)
真正的问题是......有人会知道你的伪随机数和真随机数之间的区别吗?我认为没有人愿意。默认情况下,您找到的库非常合理,以至于您的用户永远无法找到任何模式。
答案 2 :(得分:2)
也许你对几个不同的概念感到困惑。
一个概念是不可预测性:由于PRGN基于确定性算法和单个种子值,因此可以基于对先前数字的观察来预测下一个“随机”数字。这是密码学中的一个大问题,所以为了避免这种情况,你可以从一些真正的熵源中选择一个“真正的”随机数,例如/dev/random
。但是,这仅适用于一个随机数。
另一个概念是概率分布。如果你想要在一个区间内均匀分布数字,你需要一种方法来正确地实现这一点,否则你的随机事件将会出现偏斜。这与不可预测性无关,而相当可预测的伪RNG可能完全适合于产生统计上正确的统一(或任何衍生的)分布。
由于您的游戏机制几乎肯定取决于随机事件的良好统计特性,因此您应该主要关注选择一个好的伪RNG,然后从足够随机的源(可能/dev/random
)中播种。在需要控制随机事件统计特性的游戏中,真正的随机性并不好。
答案 3 :(得分:1)
根据个人经验,这取决于您如何访问随机数。如果你在非常快速的连续中一个接一个地生成许多随机数,那么你可能想要更复杂的东西(例如创建一个大的随机值向量)。然而,对于典型的RPG游戏,标准RNG应该没问题。
答案 4 :(得分:1)
由于计算机是确定性的,任何随机数生成器都是伪随机数。但是,有些算法比其他算法更好。
对于游戏来说,内置的std :: rand功能绰绰有余。更复杂的随机数生成器的唯一真正应用是加密。
答案 5 :(得分:1)
首先,在软件中实现的每个随机数发生器都是伪随机的,你需要依靠一些物理现象(如放射性衰变)来保证(通过现代物理学)随机性。但在大多数应用程序中(我不熟悉你),计算简单的伪随机生成器的随机性是完全可以接受的。 TR1中添加了许多设施,无需重新发明轮子,只需查看此文章:Random number generation using C++ TR1
答案 6 :(得分:0)
在linux中,/dev/random
是一个很好的解决方案。
对于真实随机值,您不能只使用程序。软件无法生成真正的随机值。但几乎不需要真正的随机性。
你能更具体地了解你需要的随机数吗?