在C中设置间隔生成随机数

时间:2016-11-22 17:29:59

标签: c random

我知道python,在设定的时间间隔内创建一个随机数是如此简单,但是在C中它似乎有点复杂。所以这就是我通过查看堆栈溢出的其他问题而得到的。

int diceroll_1;
diceroll_1=(rand()%3)+1;
printf("%d\n",diceroll_1);

问题在于它每次都给我3个。我希望每次编译和运行程序时它都不同。我希望它从1到3随机。我的理解是,这可能会节省它,这就是为什么它每次产生3而不是我想要的。如何每次生成一个随机数而不是相同的数字?

2 个答案:

答案 0 :(得分:3)

你有种子srand吗?如果没有,请尝试这样:

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

int main(void)
{
    srand(time(NULL)); // only once

    // roll the dice
    int diceroll_1;
    diceroll_1=(rand()%3)+1;
    printf("%d\n",diceroll_1);

   return 0;
}

输出:

Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
3
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
1

PS:

rand()产生伪随机数,就像我们的教授一样。在IP坚持!它需要播种,否则会一次又一次地给出相同的数字,因为从ref我们得到了:

  

如果未提供种子值,则自动执行rand()函数          种子值为1。

答案 1 :(得分:0)

rand函数的工作原理是生成先前生成的随机数,对其执行一些排列,然后返回。如果它是第一次调用rand,它将获取随机数生成序列的种子值并置换它。

请记住,计算机基本上是确定性的机器,硬件/ CPU指令级别并不存在“随机性”,除非TRNGs等新奇设备。

像Python这样的高级语言可能会隐藏这一点,并在后台自动将随机数生成播种到系统时间,但C不会。在调用srand之前,您需要使用种子值调用rand

现在,使用srandsrand(3);等参数调用srand(100);会相互生成不同的随机数,每次都会是相同的序列。如果您想为种子提供真正独特的值,请尝试使用当前系统时间:

srand((unsigned)time(NULL));