2017-04-02 87 views
1

我正在嘗試編寫一個隨機數字,介於1和14之間(代表一副撲克牌)。代碼應將值存儲在數組中,限制爲52.每個數字只能存儲4次(因爲一副牌中有4套)。所以,最後,我應該爲person_a和person_b顯示兩個隨機化套牌。在C中隨機化數字並將它們存儲在整數數組中

我的問題是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

爲什麼你的問題標記爲'C++'? – Siguza

+3

因爲你已經將'cards'聲明爲'static'數組。 –

+0

@DavidBowling謝謝!你會如何建議我解決這個問題? –

回答

3

你的問題,從cards被聲明爲randomize_deck()功能static陣列的事實造成的。所以,第一個撥打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; 
} 
+0

非常感謝你的回答。當我在做這個問題時,我沒有考慮在main函數中聲明數組並通過randomize_deck()傳遞它們。您對解決方案的解釋以及爲什麼我的代碼無法正常工作特別有用!我不知道我的代碼指向了相同的數組指針,儘管已經在數組中將這些卡片隨機化了。只有一個問題,使用size_t有什麼好處,而不是像我這樣的全局變量? –

+0

對於數組索引,'size_t'是正確的類型;有可能'int'不能保存所有的數組索引(不過不太可能,這點有點迂迴)。至於使用全局常量'MAX_DECK',這沒有錯,但很多人認爲它是不好的風格。 1)全局的使用通常是不被接受的;當你有一個很好的理由時,你應該只使用全局變量。 2)通過在函數調用中傳遞數組的大小,代碼看起來更清晰。 –

2

」 ......隨機甲板爲person_a和person_b是同樣的,我不知道爲什麼。「

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; 
} 
+0

你是對的。 Ammended。 – 0xDEFACED

+0

更好:) +1顯示其他選項。順便說一句,它看起來像你有一個失蹤的家長。 –

+0

謝謝你,你打敗了我,所以信貸(upvote)也是:) – 0xDEFACED

相關問題