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循环