2012-09-13 63 views
0

我正在寫一個拼字遊戲程序,它將隨機生成一個7個字母的數組。隨機字母分佈限制

這是我的代碼,可以生成字母並將它們放入數組中,並且效果很好。

char randomletters (char letters[8], int i){ 

srand((time(NULL))); 


for(i=0; i<7; i++){ 
    letters[i] = (rand() % 26 + 65); 
} 


    return letters[8]; 
} 

我唯一的問題是搞清楚如何限制的時候一定字母可以出現的數量,使用標準拼字分佈。如'B'只能出現兩次。我在考慮一種做法,那就是26,如果說明每個字母有多少在那裏,那麼它是否重新開始?看起來好像不是這樣做的最好方式。

不尋找代碼的答案,只是想法如何使它發生。

在此先感謝。

+0

忘了提及它只會產生大寫字母,而我在C. – Ryan

+2

工作它可能會更容易保留你想要的字母數組使用,然後計算該數組中的隨機索引。 –

+2

@chris不幸的是,你不能在C中做到這一點。 –

回答

0

創建一個結構數組來保存一個字母及其可以使用的次數。隨機選擇一個介於0和25之間的數字,如果所選單元格的計數大於0,則將該字母添加到機架中可減少字母數量,重複此過程直至機架計數7個瓦片,重複整個思考過程,直到剩下7個字母爲止。

+0

我對於使用結構不是很熟練,但是我不能做同樣的想法,但是隻有所有可能的字母數組?例如,AAAAAAAAABBC C ...等等? – Ryan

+0

是當然,假設你有一個數組[N],設置MAX = N-1,然後隨機選擇一個字母在0和MAX之間,將它與位置MAX中的字母交換,減少MAX,直到你的機架有7個字母,重複直到MAX <7機架完成後......我會將其添加到我的回答中 – Kwariz

+0

是的,有這樣的所有可能的字母數組實際上會給你一個更好的結果,這是因爲到目前爲止給出了兩個答案,選擇一個A作爲一個Z平等的變化ñ雖然有7個A的,只有1 Z. – vacawama

1
char array[] = "AAAAAAAAABBCCD"; 

unsigned remaining = sizeof array; 


int get_a_letter(void) 
{ 
    unsigned idx; 
    int sample; 

    if (!remaining) return EOF; 

    idx = urnd(remaining); 
    sample = array[idx] ; 
    array [idx] = array [--remaining]; 
    array [remaining] = sample; // @Note:1 
    return sample; 
} 

urnd(xxx)是應該返回0和(XXX-1)之間的隨機值,包容的功能。

更新

@注1:這種說法是沒有必要繪製一個隨機的信,但它有助於爲下一輪:重置remaining = sizeof array;就足以重新開始。 (該陣列將被炒,但所有的首字母仍然存在)