【发布时间】:2017-08-27 01:30:21
【问题描述】:
我正在尝试编写一个代码,将 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);
}
【问题讨论】:
-
为什么你的问题被标记为
C++? -
因为您已将
cards声明为static数组。 -
@DavidBowling 谢谢!你会建议我如何解决这个问题?
-
同意,C 或 C++ 很重要。如果您想要 C 解决方案,我会在几分钟内发布答案。
-
如果您想要替代检查重复项,请考虑利用the Fisher Yates Shuffle。