在C中随机化数字并将其存储在整数数组中
我试图写一个代码,它将1到14之间的数字随机化,象征着一副牌中的一套。代码应将值存储在一个限制为52的数组中。每个号码只能储存4次,因为一副牌中有4套西装。所以,最后,我应该为person_a和person_b显示两个随机的组 我的问题是,人a和人b的随机组是相同的。我不知道为什么。我尝试使用srand进行种子设定,并对随机数使用rand。有人能帮忙吗 而且,我知道我的代码非常混乱和糟糕。对不起,这是我第一次参加C课程。代码如下:在C中随机化数字并将其存储在整数数组中,c,arrays,random,C,Arrays,Random,我试图写一个代码,它将1到14之间的数字随机化,象征着一副牌中的一套。代码应将值存储在一个限制为52的数组中。每个号码只能储存4次,因为一副牌中有4套西装。所以,最后,我应该为person_a和person_b显示两个随机的组 我的问题是,人a和人b的随机组是相同的。我不知道为什么。我尝试使用srand进行种子设定,并对随机数使用rand。有人能帮忙吗 而且,我知道我的代码非常混乱和糟糕。对不起,这是我第一次参加C课程。代码如下: #include <stdlib.h> #inclu
#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);
}
您的问题源于这样一个事实,即在randomize_deck函数中将卡片声明为静态数组。因此,第一次调用randomize_deck会用随机卡片填充这个数组,返回一个指向卡片的指针。然后,第二次调用randomize_deck用新的随机卡填充同一静态数组,并返回指向同一静态数组的指针。所有这些之后,person_a和person_b都指向同一个静态数组 一种解决方案是更改randomize_deck函数以接受返回类型为void的数组参数。此外,最好将数组的大小传递给随机化组,而不是依赖于全局常量。请注意,在下面的代码中,我已将数组索引变量更改为size\u t类型,这是一种保证保存任何数组索引的无符号整数类型,也是数组索引的正确类型
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);
}
}
}
您的问题源于这样一个事实,即在randomize_deck函数中将卡片声明为静态数组。因此,第一次调用randomize_deck会用随机卡片填充这个数组,返回一个指向卡片的指针。然后,第二次调用randomize_deck用新的随机卡填充同一静态数组,并返回指向同一静态数组的指针。所有这些之后,person_a和person_b都指向同一个静态数组 一种解决方案是更改randomize_deck函数以接受返回类型为void的数组参数。此外,最好将数组的大小传递给随机化组,而不是依赖于全局常量。请注意,在下面的代码中,我已将数组索引变量更改为size\u t类型,这是一种保证保存任何数组索引的无符号整数类型,也是数组索引的正确类型
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);
}
}
}
…人员a和人员b的随机甲板相同。我不知道为什么
静态整数卡[MAX_牌组]
这是因为您将整数数组声明为
这意味着每次调用函数randomize_deck时,将对同一个int数组进行操作,并返回相同的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
}
在你的主要职能中有一个重要的步骤需要注意。您无需解除分配在randomize_牌组中分配的卡的内存。所以,你必须释放人a和人b
…人员a和人员b的随机甲板相同。我不知道为什么
静态整数卡[MAX_牌组]
这是因为您将整数数组声明为
这意味着每次调用函数randomize_deck时,将对同一个int数组进行操作,并返回相同的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
}
在你的主要职能中有一个重要的步骤需要注意。您无需解除分配在randomize_牌组中分配的卡的内存。所以,你必须释放人a和人b
为什么你的问题被标记为C++?因为你已经声明了卡是静态数组。你会建议我如何解决这个问题?同意,C或C++的事情。如果你想要一个C解决方案,我会在几分钟后回复一个答案。如果你想选择一个替代的重复,考虑利用。为什么你的问题被标记为C++?因为你已经声明卡作为静态数组。@戴维波林谢谢!你会建议我如何解决这个问题?同意,C或C++的事情。如果你想要一个C的解决方案,我会在几分钟后发表一个答案。如果你想选择一个替代的重复,考虑利用。非常感谢你的答案。在解决这个问题时,我没有考虑在main函数中声明数组并将它们传递给randomize_deck。您对解决方案的解释以及我的代码不起作用的原因特别有用!我不知道我的代码指向的是同一个数组指针,尽管在数组中随机化了卡片。只有一个问题,使用size\u t而不是像我这样的全局变量有什么好处吗?对于数组索引,size\u t是正确的类型;一个int可能无法保存所有数组索引,尽管可能性不大,但这一点有点迂腐。至于使用全局常数Max层,这不是错误的,但很多人认为它是坏的风格。一般不赞成使用globals;只有当你有很好的理由时才应该使用globals。
2通过在函数调用中传递数组的大小,代码看起来更清晰。非常感谢您的回答。在解决这个问题时,我没有考虑在main函数中声明数组并将它们传递给randomize_deck。您对解决方案的解释以及我的代码不起作用的原因特别有用!我不知道我的代码指向的是同一个数组指针,尽管在数组中随机化了卡片。只有一个问题,使用size\u t而不是像我这样的全局变量有什么好处吗?对于数组索引,size\u t是正确的类型;一个int可能无法保存所有数组索引,尽管可能性不大,但这一点有点迂腐。至于使用全局常数Max层,这不是错误的,但很多人认为它是坏的风格。一般不赞成使用globals;只有当你有很好的理由时才应该使用globals。2通过在函数调用中传递数组的大小,代码看起来更清晰。最好:+1显示其他选项。顺便说一句,看起来你有一个失踪的父母。谢谢你,老兄,你打败了我,所以也要感谢你:更好:+1显示了另一个选项。顺便说一句,看起来你有一个失踪的父母。谢谢你,老兄,你比我先这么做了,所以请也投票给你: