C 当调用函数两次时,生成一个随机数不起作用

C 当调用函数两次时,生成一个随机数不起作用,c,function,random,srand,C,Function,Random,Srand,当我两次调用我的函数时,我试图得到两种不同类型的数字/颜色,但它不起作用。我已经植入了数字/函数,但它仍然不起作用 下面是我的代码的外观: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> #define DIAMONDS 0 #define CLUBS 1 #define HEARTS 2 #define SPADES 3

当我两次调用我的函数时,我试图得到两种不同类型的数字/颜色,但它不起作用。我已经植入了数字/函数,但它仍然不起作用

下面是我的代码的外观:

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

#define DIAMONDS 0
#define CLUBS 1
#define HEARTS 2
#define SPADES 3
#define JACK 11
#define QUEEN 12
#define KING 13
#define ACE 1
#define COLOR_SIZE 13
#define NR_OF_SUITS 4
#define DECK_SIZE 52


struct Card
{
    int suit;
    int value;
};

void printCards(struct Card *cardDeck);
void swapCards(struct Card *cardA, struct Card *cardB);
void shuffleCards(struct Card *cardDeck);
void printOneCards(struct Card *cardDeck);

int main()
{
    //struct Card deck[DECK_SIZE];      //Statiskt allokerad array
    struct Card * deck; //Dynamiskt allokerad array
    int index;
    int suit_index;

    deck = (struct Card *)malloc(sizeof(struct Card) * DECK_SIZE);
    for (suit_index = 0; suit_index < NR_OF_SUITS; suit_index++)    /* Initiera kortleken */
        for (index = 0; index < COLOR_SIZE; index++)
        {
            deck[suit_index*COLOR_SIZE + index].suit = suit_index;
            deck[suit_index*COLOR_SIZE + index].value = index;
        }
    printCards(deck);
    shuffleCards(deck);
    printCards(deck);
    printf("\n");
    printOneCards(deck);
    printf("Dealers cards\n");
    srand(time(NULL));
    printOneCards(deck);

    system("pause");
    return 0;
}

void printCards(struct Card *cardDeck)
{
    for (int i = 0; i < DECK_SIZE; i++)
    {
        switch (cardDeck[i].value + 1)
        {
        case ACE: printf("Ace ");
            break;
        case JACK: printf("Jack ");
            break;
        case QUEEN: printf("Queen");
            break;
        case KING: printf("King ");
            break;
        default: printf("%d ", cardDeck[i].value + 1);
            break;
        }
        printf("of ");
        switch (cardDeck[i].suit)
        {
        case DIAMONDS: printf("Diamonds ");
            break;
        case HEARTS: printf("Hearts ");
            break;
        case CLUBS: printf("Clubs ");
            break;
        case SPADES: printf("Spades ");
            break;
        default: printf("Something went wrong!! ");
            break;
        }
        printf("\n");
    }
}

void swapCards(struct Card * cardA, struct Card *cardB)
{
    struct Card temp;
    temp = *cardA;
    *cardA = *cardB;
    *cardB = temp;
}

void shuffleCards(struct Card *cardDeck)
{
    srand(time(NULL));

    for (int i = 0; i < DECK_SIZE; i++)
        swapCards(&cardDeck[i], &cardDeck[rand() % 52]);
}
void printOneCards(struct Card *cardDeck)
{
    srand(time(NULL));
    for (int i = 0; i < 2; i++)
    {
        switch (cardDeck[i].value + 1)
        {
        case ACE: printf("Ace ");
            break;
        case JACK: printf("Jack ");
            break;
        case QUEEN: printf("Queen");
            break;
        case KING: printf("King ");
            break;
        default: printf("%d ", cardDeck[i].value + 1);
            break;
        }
        printf("of ");
        switch (cardDeck[i].suit)
        {
        case DIAMONDS: printf("Diamonds ");
            break;
        case HEARTS: printf("Hearts ");
            break;
        case CLUBS: printf("Clubs ");
            break;
        case SPADES: printf("Spades ");
            break;
        default: printf("Something went wrong!! ");
            break;
        }
        printf("\n");
    }
}
\define\u CRT\u SECURE\u NO\u警告
#包括
#包括
#包括
#定义钻石0
#定义俱乐部1
#定义心脏2
#定义黑桃3
#定义杰克11
#定义女王12
#定义国王13
#定义ACE 1
#定义颜色大小13
#定义第4组的数量
#定义甲板尺寸52
结构卡
{
内服;
int值;
};
作废打印卡(结构卡*卡片组);
作废交换卡(结构卡*信用卡,结构卡*信用卡);
作废shuffleCards(结构卡*卡片组);
作废printOneCards(结构卡*cardDeck);
int main()
{
//结构卡片组[卡片组大小];//Statiskt allokerad数组
struct Card*deck;//Dynamiskt allokerad数组
整数指数;
int-suit_指数;
卡片组=(结构卡片*)malloc(卡片组大小)*卡片组大小;
对于(西服指数=0;西服指数<西服数量;西服指数++)/*Initiera kortleken*/
用于(索引=0;索引
因此,当我调用函数
printonecards()
时,它第一次随机打印出2张卡片并对其着色,但第二次调用时,它没有。
如何解决此问题以及如何使其正常工作?

TL;DR您只需在程序开始时为PRNG(伪随机数生成器)设定一次种子。删除
srand(时间(空))并将其放入
main()

更详细地说,
time(NULL)
的时间粒度为1秒。这意味着,如果在1秒内多次调用,它将返回相同的值。这样,您将一次又一次地使用相同的值对PRNG进行播种,因此,
rand()
生成的伪随机数将是相同的


这就是为什么,您需要从调用的函数中删除种子设定部分,以避免重新设定PNRG的种子设定。

您在多个函数开始时调用了几次
srand
srand
为随机数生成器设定种子,仅当您希望重置随机数生成器时才应调用。当您使用
time(NULL)
在同一秒内多次调用
srand
作为种子时(考虑到当前硬件,这是很有可能的),您将使用同一种子和干净的随机数生成器。这将多次生成相同的数字

解决此问题的方法是将对
srand
的调用移动到
main
的开头,然后在所有其他函数中将其删除。这样,您的随机数生成器将被精确设置为一,并且不会被重置,从而产生更多的随机数

编辑:

我第一次没有注意到的另一个问题是,将相同的参数传递给函数
printOneCards
,即参数
deck
。此参数在玩家的牌和庄家的牌之间没有区别,这意味着该函数将打印同一副牌两次

因为一个玩家似乎总是有两张牌,你可以使用指针算法来改变这一点。然后,您的函数调用将变为:

printOneCards(deck); //Print the first and second card
printf("Dealers cards\n");
printOneCards(deck+2); //Print the third and fourth card
这样,玩家和庄家的结果都会有所不同,正如你所希望的那样。

你可以在任何时候使用
srand()
来播种一个新的随机数。如果将
srand(time(NULL))
置于for循环while循环