我正在尝试编写一个代码,该代码随机化1到14之间的数字(象征着一副牌中的一套)。代码应将值存储在一个限制为52的数组中。每个数字只能存储4次(因为一副牌中有4个套装)。所以,最后,我应该为person_a和person_b显示两个随机化的套牌。
我的问题是person_a和person_b的随机化套牌是相同的。我不知道为什么。我尝试使用srand()播种,并使用rand()作为随机数。有人可以帮忙吗?
另外,我知道我的代码非常混乱和糟糕。对不起 - 这是我第一次参加C课程。以下是代码:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define MAX_DECK 52
#define REPETITIONS 4
#define CARDS_HIGH 14
#define CARDS_LOW 1
int
randomize_check(int value_check, int limit, int cards[])
{
int count = 0;
int i = 0;
for(i=0; i<limit; i++)
{
if(cards[i]==value_check)
{
count++;
}
}
if(count>REPETITIONS)
{
return -1;
}
else if (count<=REPETITIONS)
{
return 1;
}
}
int
get_random(void)
{
int random_number = 0;
random_number = (rand()%(CARDS_HIGH-CARDS_LOW))+CARDS_LOW;
return(random_number);
}
int * randomize_deck(void)
{
static int cards[MAX_DECK];
int i = 0;
int randomize = 0;
int check = 0;
for (i=0; i<MAX_DECK; i++)
{
randomize = get_random();
cards[i] = randomize;
check = randomize_check(cards[i], MAX_DECK, cards);
while((check) == -1)
{
randomize = get_random();
cards[i] = randomize;
check = randomize_check(cards[i], MAX_DECK, cards);
}
}
return(cards);
}
int
main(void)
{
srand ( time(NULL) );
int i = 0, j = 0;
int *person_a = randomize_deck();
int *person_b = randomize_deck();
for (i = 0; i < MAX_DECK; i++) //print_a
{
printf( "Cards[a%d]: %d\n", i, *(person_a + i));
}
printf("\n");
for (j = 0; j < MAX_DECK; j++) //print_b
{
printf( "Cards[b%d]: %d\n", j, *(person_b + j));
}
return(0);
}
答案 0 :(得分:3)
您的问题源于cards
在static
函数中声明为randomize_deck()
数组的事实。因此,第一次调用randomize_deck()
会使用随机卡填充此数组,并返回指向cards
的指针。然后第二次调用randomize_deck()
使用新的随机卡填充相同的static
数组,并返回指向同一static
数组的指针。完成所有这些后,person_a
和person_b
都指向相同的static
数组。
一种解决方案是将randomize_deck()
函数更改为接受数组参数,返回类型为void
。此外,最好将数组的大小传递给randomize_deck()
,而不是依赖于全局常量。请注意,在下面的代码中,我已将数组索引变量更改为类型size_t
,这是一个unsigned
整数类型,保证包含任何数组索引,以及数组索引的正确类型。
void randomize_deck(int cards[], size_t deck_sz)
{
size_t i = 0;
int randomize = 0;
int check = 0;
for (i = 0; i < deck_sz; i++)
{
randomize = get_random();
cards[i] = randomize;
check = randomize_check(cards[i], deck_sz, cards);
while((check) == -1)
{
randomize = get_random();
cards[i] = randomize;
check = randomize_check(cards[i], deck_sz, cards);
}
}
}
然后在main()
中,您声明了两个int
数组,每个玩家一个,并将这些数组传递给randomize_deck()
函数:
int main(void)
{
srand ( time(NULL) );
size_t i = 0, j = 0;
int person_a[MAX_DECK];
int person_b[MAX_DECK];
randomize_deck(person_a, MAX_DECK);
randomize_deck(person_b, MAX_DECK);
/* ... */
return 0;
}
答案 1 :(得分:2)
&#34; ... person_a和person_b的随机套牌是相同的。我不明白为什么。&#34;
static int cards[MAX_DECK];
发生这种情况是因为您将整数数组声明为static
这意味着每次调用函数randomize_deck
时,将运行相同的int数组,并且将返回相同的颜色。**
int * randomize_deck(void) {
int* cards = malloc(sizeof int) * MAX_DECK); // Instantiate a new and different deck of cards every time the function is called.
int i = 0;
int randomize = 0;
int check = 0;
/* next steps randomize_deck function */
return cards; // Now you will return a different deck of cards every time you invoke the function
}
在main()
功能中需要注意一个重要步骤。您无需取消分配在randomize_deck()
中分配的卡的内存。因此,您必须释放person_a
和person_b
。
int main(void)
{
srand ( time(NULL) );
int i = 0, j = 0;
int *person_a = randomize_deck();
int *person_b = randomize_deck();
/* ... */
free(person_a); // You need to free these elements you returned,
free(person_b);
return 0;
}