gpt4 book ai didi

c - 调用函数两次时生成随机数不起作用

转载 作者:行者123 更新时间:2023-11-30 20:12:44 25 4
gpt4 key购买 nike

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

这是我的代码的外观:

    #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");
}
}

因此,当我调用函数 printonecards() 时,它第一次会打印出 2 张随机卡片和颜色,但第二次调用它时,它不会打印。如何解决此问题以及如何使其正常工作?

最佳答案

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

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

编辑:

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

由于玩家似乎总是有 2 张牌,因此您可以使用指针算术来改变这一点。您的函数调用将变为:

printOneCards(deck); //Print the first and second card
printf("Dealers cards\n");
printOneCards(deck+2); //Print the third and fourth card

这样,您将按照您的预期为玩家和庄家获得不同的结果。

关于c - 调用函数两次时生成随机数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34480579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com