随机数生成器,不使用rand()/ srand()C函数

时间:2012-10-15 14:39:36

标签: c

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

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

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

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

它不一定非常强大 - 我没有对数字进行任何加密。 我正在考虑编写一些小而且非常简单的生成器(类似于花时间和XOR的东西,并用一些素数和bla bla bla做一些事情),但我想知道是否有人指向更合适的生成器。

2 个答案:

答案 0 :(得分:3)

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

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

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

为特定目的设计了各种类型的伪随机数发生器。即使你知道它们是如何工作的,也有安全的PRNG很慢但难以预测,并且有像Mersenne Twister这样的大型PRNG具有良好的分布特性,因此可用于编写蒙特卡罗模拟。

根据经验,线性同余生成器足以编写游戏(怪物会造成多大的伤害),但不足以编写模拟。有一个丰富多彩的历史,研究人员为他们的项目选择了差的PRNGs;结果他们的模拟结果很可疑。

答案 1 :(得分:0)

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

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

它不仅提供一个发电机,而且提供数十个发电机,并概述速度,内存要求和随机性质量。