c++强随机数生成器-必需的

C++ Strong Random Number Generator - necessary?

本文关键字:随机数生成器 c++      更新时间:2023-10-16

我的最新项目是开发一款基于文本的RPG,现在我需要一个随机数生成器,一个能够在不同情况下计算某些操作是否可以毫无问题地执行的生成器。大家都知道,基本函数std::srandstd::rand是计算伪随机值的简单易行的算法。但是我想要的是实值而不是伪值。因此,我想问的是,如果使用比上面提到的更好的解决方案并坚持基本原则,是否会过度杀伤;如果没有,你有什么建议?如何实现这样一个"好的生成器"?

我建议使用Boost.Random。它有许多非常好的(和快速的)rng。你不需要一个加密安全的,但他们提供的比rand更好。

我自己会选mt19937。它的周期很长,而且速度很快。但提高。随机有许多这些东西,用于大多数非加密安全需求。

真正的问题是……有人知道你的伪随机数和真随机数的区别吗?我想没人会。默认情况下,您找到的库是足够健全的,您的用户将永远无法找到任何模式。

也许你对几个不同的概念感到困惑。

一个概念是不可预测性:由于PRGN基于确定性算法和单个种子值,因此可以根据对先前数字的观察来预测下一个"随机"数字。这在密码学中是一个巨大的问题,因此为了避免这个问题,您将从一些真正的熵源(如/dev/random)中选择一个"真"随机数。然而,这只对一个随机数有用。

另一个概念是概率分布。如果您希望数字在一个间隔内均匀分布,则需要一种方法来正确实现这一点,否则随机事件将出现偏差。这与不可预测性无关,一个相当可预测的伪rng可能完全适合产生统计上正确的均匀(或任何派生)分布。

因为你的游戏机制几乎肯定会依赖于随机事件的良好统计属性,所以你应该主要专注于选择一个良好的伪rng,然后从足够随机的来源(可能是/dev/random)中为其提供种子。在需要控制随机事件统计属性的游戏中,真正的随机性并不是什么好东西。

根据个人经验,这取决于您如何访问随机数。如果你在非常快的连续中一个接一个地生成许多随机数,那么你可能需要更复杂的东西(例如创建一个大的随机值向量)。但是对于一款典型的RPG游戏来说,标准的rng就足够了。

由于计算机是确定性的,所以任何随机数生成器都是伪随机的。然而,有些算法比其他算法更好。

对于游戏,内置的std::rand函数绰绰有余。更复杂的随机数生成器的唯一实际应用是加密。

首先,软件中实现的每个随机数生成器都是伪随机的,您需要依赖一些物理现象(如放射性衰变)来保证(由现代物理学)随机性。但在大多数应用程序中(我不熟悉你的应用程序),计算简单的伪随机生成器的随机性是可以接受的。TR1中添加了许多这样的功能,无需重新发明轮子,只需查看这篇文章:使用c++ TR1生成随机数

在linux中,/dev/random是一个很好的解决方案。

对于真实的随机值,您不能仅仅使用程序。软件无法生成真正的随机值。但真正的随机性几乎是不需要的。

你能更具体地说一下你需要这些随机数做什么吗?