随机函数在C语言中是如何工作的?

随机函数在C语言中是如何工作的?,c,C,我的程序每次运行时都返回相同的值: #include <stdio.h> #include <stdlib.h> int main(void) { int randomNum = rand() % 100; printf("random number: %d", randomNum); } 这是为什么?我如何修复它?这是因为rand是一个伪随机数生成器,这意味着它为任何给定的输入返回相同的序列。默认情况下,输入为1 您可以为随机数生成器设定种子时间,以便在每次

我的程序每次运行时都返回相同的值:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int randomNum = rand() % 100;
  printf("random number: %d", randomNum);
}
这是为什么?我如何修复它?

这是因为rand是一个伪随机数生成器,这意味着它为任何给定的输入返回相同的序列。默认情况下,输入为1

您可以为随机数生成器设定种子时间,以便在每次运行程序时获得不同的值:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    struct timespec ts;

    timespec_get(&ts, TIME_UTC);

    srand(ts.tv_sec ^ ts.tv_nsec);

    int random_num = rand() % 100;
    printf("random number: %d", random_num);
}

如果您有POSIX,还可以在srand的参数中添加+getpid并包含。

如果不显示正在使用的代码,则无法回答此问题。请回答您的问题并将其包括在内。非常感谢。它被称为伪随机数生成器是有原因的。a当堆栈溢出时,请始终显示上下文的代码。B内置的rand非常垃圾,有局限性。其中之一是,如果使用srandtimeNULL,则在任何给定的秒内都会得到相同的数字序列。如果你没有种子,我们不知道,因为我们看不到你的代码。这是否回答了你的问题?这本应作为副本关闭,而不是因为它脱离主题。OP在关闭之前几乎没有机会回应批评。@tadman现在它有一个警告,如果在同一纳秒内运行两次,或者比最初的调用晚一秒,它将产生相同的结果。谢谢S.S。Anne@jwdonahue有人不得不抱怨,所以我改了。虽然这是学术性的,许多系统已经被破解,因为有人没有正确地为随机数生成器播种。srandtimeNULL已经给该行业造成了至少数百万美元的损失。值得指出的是所采取的任何方法的局限性,而不是宣布它是固定的。现在可能更像是数十亿美元。