This question already has answers here:
srand() — why call it only once?
                                
                                    (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