2

我正在用 C 语言开发一些可供各种用户应用程序使用的库。

该库应该是完全“透明的”——用户应用程序可以对其进行初始化和完成,并且它不应该在运行的应用程序中看到任何变化。

问题是 - 我在库初始化中使用 C srand()/rand() 函数,这意味着库确实会影响用户的应用程序 - 如果用户生成随机数,他们将受到 rand()已经被调用了。

那么,谁能指出一些简单的非 GPL替代 C 中的 rand() 随机数生成器?

它不必非常强大 - 我没有对数字进行任何加密。我正在考虑编写一些小型且非常简单的生成器(例如花时间和 XOR 某些东西,并用一些素数和 bla bla bla 做一些事情),但我想知道是否有人有一个指向更体面的生成器的指针。

4

2 回答 2

3

它通过保持一些状态并在每次调用函数时修改状态来生成下一个数字。这样的函数称为伪随机数生成器。创建 PRNG 的一种旧方法是线性同余生成器,这很简单:

static int rand_state;
int rand(void)
{
    rand_state = (rand_state * 1103515245 + 12345) & 0x7fffffff;
    return rand_state;
}

如您所见,如果您知道前一个数字,则此方法允许您预测系列中的下一个数字。还有更复杂的方法。

已经为特定目的设计了各种类型的伪随机数发生器。有一些安全的 PRNG,虽然速度很慢,但即使你知道它们是如何工作的也很难预测,还有像 Mersenne Twister 这样的大型 PRNG,它们具有很好的分布特性,因此对于编写 Monte Carlo 模拟很有用。

根据经验,线性同余生成器足以编写游戏(怪物造成多少伤害),但不足以编写模拟。研究人员选择较差的 PRNG 用于他们的项目的历史是丰富多彩的。因此,他们的模拟结果令人怀疑。

于 2012-10-15T14:43:13.120 回答
0

如果您也可以接受 C++,请查看 Boost。

http://www.boost.org/doc/libs/1_51_0/doc/html/boost_random/reference.html

它不仅提供一个生成器,而且提供几十个生成器,并概述了速度、内存要求和随机性质量。

于 2012-10-15T14:51:27.857 回答