随机化C中的数字并将它们存储在整数数组中

时间:2017-04-02 00:15:35

标签: c arrays random

我正在尝试编写一个代码,该代码随机化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);
}

2 个答案:

答案 0 :(得分:3)

您的问题源于cardsstatic函数中声明为randomize_deck()数组的事实。因此,第一次调用randomize_deck()会使用随机卡填充此数组,并返回指向cards的指针。然后第二次调用randomize_deck()使用新的随机卡填充相同的static数组,并返回指向同一static数组的指针。完成所有这些后,person_aperson_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_aperson_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;
}