This question already has answers here:
srand() — why call it only once?
(7个答案)
7个月前关闭。
我正在尝试制作一个程序以生成2个随机数并将其打印到屏幕上。这是通过两次调用Numbers函数并将值分配给num1和num2,然后也使用这些变量两次调用PrintMsg来实现的,但是该函数将第一个值打印两次。
在调试器中,num1和num2被设置为2个不同的数字,并且模式变量已成功传递给PrintMsg函数。
谢谢。
(7个答案)
7个月前关闭。
我正在尝试制作一个程序以生成2个随机数并将其打印到屏幕上。这是通过两次调用Numbers函数并将值分配给num1和num2,然后也使用这些变量两次调用PrintMsg来实现的,但是该函数将第一个值打印两次。
在调试器中,num1和num2被设置为2个不同的数字,并且模式变量已成功传递给PrintMsg函数。
// C program to generate random numbers
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include<time.h>
int Numbers() {
bool valid = false;
int randNum;
srand(time(0));
while(valid != true) {
randNum = rand() % 100;
if (randNum > 0 && randNum <= 6) {
valid = true;
}
}
return(randNum);
}
void PrintMsg(int x, int mode) {
if (mode == 1) {
switch(x) {
case 1:
printf(" %d ", x);
break;
case 2:
printf(" %d ", x);
break;
case 3:
printf(" %d ", x);
break;
case 4:
printf(" %d ", x);
break;
case 5:
printf(" %d ", x);
break;
case 6:
printf(" %d ", x);
break;
}
}
else if (mode == 2){
switch(x) {
case 1:
printf(" %d ", x);
break;
case 2:
printf(" %d ", x);
break;
case 3:
printf(" %d ", x);
break;
case 4:
printf(" %d ", x);
break;
case 5:
printf(" %d ", x);
break;
case 6:
printf(" %d ", x);
break;
return;
}
}
int main(void)
{
int num1;
int num2;
num1 = Numbers();
PrintMsg(num1, 1);
num2 = Numbers();
PrintMsg(num2, 2);
return 0;
}
谢谢。
最佳答案
您正在使用srand()
返回的当前时间在每次调用Numbers()
时使用time()
重新填充随机数生成器。现在,time()
返回以秒为单位的时间,因此,如果您在同一秒内两次调用Numbers()
,则将具有相同值的生成器作为种子,因此您将获得rand()
返回的相同值。
您应该在程序开始时只调用一次srand(time(0))
。
正如Jo Black爵士在评论中指出的那样,当您在调试器中运行代码时,您可能在连续两次调用Number()
之间等待了超过一秒钟,这就是为什么在这种情况下您没有看到这种行为的原因。
关于c - 带有不同参数的调用函数会产生相同的输出。 (C),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57027796/
10-17 01:26