如何在C(Linux)中'随机化()'随机数?

Jeh*_*uah 6 c

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

gsp*_*spr 11

为了生成伪随机数序列,需要对生成器进行种子处理.种子完全决定了将要产生的数字序列.在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);
Run Code Online (Sandbox Code Playgroud)

根据康拉德迈耶的回答,我想我会详细说明一下.我将随机数的使用分为三类:

  1. 变异.如果你使用随机数在例如游戏中创建看似随机或变化的行为,你不需要非常认真地思考这个主题,或者选择合适的种子.随着时间的推移播种,如果结果不够好,请看一些其他解决方案.在这种情况下,即使相对较差的RNG也会看起来足够随机.
  2. 科学仿真.如果您使用随机数进行科学工作,例如蒙特卡罗计算,则需要注意选择一个好的发电机.你的种子应该固定(或用户可更改).你想要变化(在上面的意义上); 你想要确定性行为但是随机性好.
  3. 加密.你会非常小心.这可能超出了此线程的范围.


Mat*_*ský 8

这是常用的解决方案:

srand ( time(NULL) );
Run Code Online (Sandbox Code Playgroud)

所有C代码的执行都是确定性的,因此每次调用时都必须引入不同的代码srand.在这种情况下,是时候了.

或者你可以从中读取数据/dev/random(像任何其他文件一样打开它).

  • 如果程序在一秒钟内运行几次,则在使用相同的种子时将多次生成相同的随机数序列! (3认同)