gpt4 book ai didi

c - 如何在 C(Linux) 中获取 'randomize()' 随机数?

转载 作者:太空狗 更新时间:2023-10-29 17:14:42 25 4
gpt4 key购买 nike

试图在 C 中生成随机数,rand() 不会在我每次编译代码时生成不同的数字,任何人都可以告诉我如何使用 srand() 或告诉任何其他生成方法。

最佳答案

为了生成pseudorandom的序列数字,生成器需要是 seeded .种子完全决定了将产生的数字序列。在 C 中,您使用 srand 作为种子,如您所指示的。根据 srand(3) 手册页,没有明确的种子设定意味着生成器将使用 1 作为种子。这解释了为什么您总是看到相同的数字(但请记住,序列本身是非常随机的,质量取决于所使用的生成器,即使序列每次都是相同的)。

用户 mzabsky 指出,获得人类用户感觉随机的种子的一种方法是随时间播种。另一种常用方法(我刚刚看到 mzabsky 也指出 - 抱歉)是使用系统随机数生成器的内容为生成器播种,该随机数生成器从鼠标移动、磁盘计时等因素提供的熵池中提取。你无法从系统生成器中获取大量随机性,因为它无法收集足够的熵。但是如果你只是从中抽取一个种子,你就会在你的程序中随机选择一个随机数序列。以下是如何在 Linux 上使用 C 语言执行此操作的示例:

unsigned int seed;
FILE* urandom = fopen("/dev/urandom", "r");
fread(&seed, sizeof(int), 1, urandom);
fclose(urandom);
srand(seed);

鉴于 Conrad Meyer 的回答,我想我应该详细说明一下。我将随机数的使用分为三类:

  1. 变化。例如,如果您使用随机数在游戏中创建看似随机或变化的行为,则无需认真考虑主题或选择合适的种子。随着时间的推移播种,如果事实证明这还不够好,请查看其他解决方案。在这种情况下,即使是相对较差的 RNG 看起来也足够随机。
  2. 科学模拟。如果您将随机数用于科学工作,例如蒙特卡罗计算,您需要注意选择一个好的生成器。您的种子应该是固定的(或用户可更改的)。你想要变化(在上面的意义上);您需要确定性行为,但又需要良好的随机性。
  3. 密码学。您需要格外小心。这可能超出了本主题的范围。

关于c - 如何在 C(Linux) 中获取 'randomize()' 随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4930833/

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