在C中设置间隔生成随机数
我知道python,在设定的时间间隔内创建一个随机数是如此简单,但是在C中它似乎有点复杂。 通过查看有关堆栈溢出的其他问题,这就是我所拥有的。
int diceroll_1; diceroll_1=(rand()%3)+1; printf("%d\n",diceroll_1);
问题是它每次给我3个。 我希望每次编译和运行程序时它都不同。 我希望它从1到3随机。 我的理解是,这可能会保存它,这就是为什么它每次产生3而不是我想要的。 如何每次生成一个随机数而不是相同的数字?
你有种子吗? 如果没有,请尝试这样:
#include #include #include 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坚持! 它需要播种,否则会一次又一次地给出相同的数字,因为从参考中我们得到了:
如果未提供种子值,则rand()函数将自动播种,值为1。
rand
函数的工作原理是生成先前生成的随机数,对其执行一些置换,然后返回。 如果它是第一次调用rand
,它将获取随机数生成序列的种子值并置换它。
请记住,计算机基本上是确定性的机器,硬件/ CPU指令级别并不存在“随机性”,除非像TRNG这样的新奇设备。
像Python这样的高级语言可能会隐藏这一点,并在后台自动将随机数生成播放到系统时间,但C不会。 在调用rand
之前,需要使用种子值调用srand
。
现在,用srand(3);
类的参数调用srand
srand(3);
和srand(100);
将产生彼此不同的随机数,它们每次都是相同的序列。 如果您想为种子提供真正独特的值,请尝试使用当前系统时间:
srand((unsigned)time(NULL));