我知道python,在设定的时间间隔内创建一个随机数是如此简单,但是在C中它似乎有点复杂。所以这就是我通过查看堆栈溢出的其他问题而得到的。
int diceroll_1;
diceroll_1=(rand()%3)+1;
printf("%d\n",diceroll_1);
问题在于它每次都给我3个。我希望每次编译和运行程序时它都不同。我希望它从1到3随机。我的理解是,这可能会节省它,这就是为什么它每次产生3而不是我想要的。如何每次生成一个随机数而不是相同的数字?
答案 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
。
现在,使用srand
和srand(3);
等参数调用srand(100);
会相互生成不同的随机数,每次都会是相同的序列。如果您想为种子提供真正独特的值,请尝试使用当前系统时间:
srand((unsigned)time(NULL));