2016-03-29 26 views
-3

我是一名學生,正在進行中期項目。我不是在尋找人爲我編碼,但我需要一些幫助。我正在嘗試製作一款二十一點遊戲,並且爲此我想爲一副牌中的每張牌設置一個52整數列表[1,1,1,1,2,2,2,2 .....] 。但是,如何從列表中取出一個隨機數並將其取消?就像一張正常的甲板一旦你拿了一張卡,你就不能重畫它。我知道一個可以爲程序設置一個隨機參數[n = rand()%11 + 1],但我想要超越以獲得一個A預設列表中的隨機數

回答

-1

您可以使用像這樣的洗牌算法:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle。 Fisher - Yates shuffle以陣列開始,然後它將數組中的每個項目與陣列中的隨機項目進行切換。它也可以逐個刪除項目,但它更復雜。您可以使用二叉樹隨機刪除項目。存儲每個節點下的項目總數。每次刪除一個項目時,都會生成一個大於或等於0且小於剩餘項目數的隨機數。從根開始。如果a小於左側子項下的項目數,則轉到左側子項。否則,讓a成爲a,然後去正確的孩子。這是遞歸的。但是逐個刪除項目更加複雜。最好只使用混洗算法。

1

無法從數組中移除隨機元素。
你可以做的是將隨機選擇的元素與數組的最後一個元素進行交換。除此之外,您還需要將有效元素的數量存儲在變量array_size_valid中的數組中,並在每次交換髮生時減少該值。

這樣你隨機指標生成功能將變爲:

rand_index = rand() % array_size_valid;

1

這裏是一個微不足道的方式:假設你有一個數組,其中包含52個整數:

int deck[52]; 

你已將其初始化爲所需的值,如1,1,1,1,2,2,2,2,......

當繪製卡時,將相應的數組e字元素爲-1(或比原來的那些以外的任何值):

int drawCard(int deck[]) 
{ 
    do{ 
     int randIndex = rand() % 52; 
    } while(deck[randIndex] == -1); 

    int drawnCard = deck[randIndex]; 
    deck[randIndex] = -1; 
    return drawnCard; 
} 

雖然這種方法可能還不夠高效,它的工作,所以我認爲這可能有助於你一樣的初學者。

+0

正是我在找的謝謝你。 – jojobuddy13

+0

@ jojobuddy13如果你覺得它解決了你的問題,請接受這個答案:) –

+0

這有可能進入一個無限循環。 –