Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中随机化数字并将其存储在整数数组中_C_Arrays_Random - Fatal编程技术网

在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

我试图写一个代码,它将1到14之间的数字随机化,象征着一副牌中的一套。代码应将值存储在一个限制为52的数组中。每个号码只能储存4次,因为一副牌中有4套西装。所以,最后,我应该为person_a和person_b显示两个随机的组

我的问题是,人a和人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);
}

您的问题源于这样一个事实,即在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显示了另一个选项。顺便说一句,看起来你有一个失踪的父母。谢谢你,老兄,你比我先这么做了,所以请也投票给你: