gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:28:39 24 4
gpt4 key购买 nike

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

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

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

那么,任何人都可以指出一些简单的非 GPL 替代 C 中的 rand() 随机数生成器吗?

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

最佳答案

它通过保持一些状态并在每次调用函数时修改状态来生成下一个数字。这样的函数称为伪随机数生成器。创建 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。因此,他们的模拟结果令人怀疑。

关于c - 不使用 rand()/srand() C 函数的随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12897992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com