2015-05-05 49 views
1

我試圖以隨機順序生成數字1-7並將它們添加到數組。我的代碼應該生成數字,檢查生成的數字是否已經在數組中,如果沒有,則將數字添加到數組中。唯一沒有正常工作的陣列位置是n [0]。我一直在努力解決問題,但我卡住了,任何幫助將不勝感激。最後3次,我跑我的程序:程序正在比較和正常工作,除了陣列[0]

3, 1, 5, 2, 3, 4, 7 
6, 1, 3, 7, 5, 2, 6 
5, 1, 7, 3, 6, 2, 5 

這裏是產生一個隨機數

int * randomize() 
{ 
    static int n[7]; 
    int i = 0; 
    int j = 0; 
    int check = 0; 
    int check2; 

    srand((unsigned)time(NULL)); 
    for(i = 0; i < 7; i++) 
    { 
    check = (rand() % 7); 
    check += 1; 

     for(j = 0; j < 7; j++) 
     { 
      check2 = (int) n[j]; 

      if(check == check2) 
      { 
       check = (rand() % 7); 
       check += 1; 
       j = 0; 
      }  
     } 

     n[i] = check; 
     j = 0; 
    } 
return n; 
} 

代碼這裏是代碼來調用從主功能和打印陣列

int *r; 

r = randomize(); 

for(i = 0; i < 7; i++){ 
    printf("%i\n", *(r + i)); 
} 
+0

附註:通常只需要使用1-7填充數組並且比shuffle更好,對於少數條目填充最後幾個元素也不會永遠佔用......下面是C#示例http:// stackoverflow。 com/questions/1150646/card-shuffling-in-c-sharp,但對於任何遠程感知c風格語法的人來說,答案應該是可讀的。 –

+0

與你的問題無關,但爲什麼在這裏強制轉換check2 =(int)n [j];'? –

+0

我包含check2 =(int)n [j]部分是我在嘗試排除問題時包含的內容。我想也許它只是不準確地比較事情,因爲我試圖比較不兼容的類型。之後,我縮小了它與n [0]的問題,但並沒有改變它。 – Shaine

回答

3
if(check == check2) 
{ 
    check = (rand() % 7); 
    check += 1; 
    j = 0; 
} 

要重新啓動內循環,請將j設置爲0。當循環進行到下一次迭代時,j++將其遞增爲1.這導致它跳過第一個索引。更改分配到:

j = -1; 

如果這看起來有點哈克,我同意,它是。我會建議重新安排一些東西,所以你不必這樣做。邏輯可能是,例如:

for (i = 0; i < 7; ++i) { 
    bool dupe = false; 

    do { 
     n[i] = random(7) + 1; 

     for (j = 0; j < i; ++j) { 
      if (n[i] == n[j]) { 
       dupe = true; 
       break; 
      } 
     } 
    } 
    while (dupe); 
} 

或者,更好的,甚至,不產生隨機數,然後檢查是否有重複。相反,按順序生成所有數字,然後scramble the list。如果列表變得更完整和更充分,並且需要更長和更長的時間才能找到可用的數字,那麼速度將會更快。

+1

好的答案,但請注意,OP正在執行隨機洗牌,一般以洗牌方式完成:) –

+0

感謝您的回答,我喜歡只是加入列表的想法,這應該有助於提高執行速度並解決我的問題。 – Shaine

3

的問題是在這裏:

if(check == check2) 
{ 
    check = (rand() % 7); 
    check += 1; 
    j = 0; 
} 

如果發現匹配,check再生爲一個隨機數,但for循環增值j由1

一個微不足道的解決將是分配給-1這裏j,但似乎不如重寫邏輯,而不是。您可以使用具有布爾標誌的do-while循環。

此外,請注意,for(j ...)循環應該真的循環到i,而不是7.否則,您將與未初始化的值進行比較。

最後,你的代碼可以改善,儘管沒有涉及到當前的問題有幾點:

更改

check = (rand() % 7); 
check += 1; 

check = rand() % 7 + 1; 

你不需要兩行來完成,並且(在我看來)它會讓你的代碼變得不可讀。

此外,srand()應在程序啓動時調用並僅調用一次。假設您打算多次撥打randomize(),您應該將srand()呼叫移動到randomize()之外。

而在你的循環中,你實際上並不需要check2變量。您可以將if條件更改爲if(check == n[j])。如果你真的想創造另一個變量,不要稱之爲check2 - 稱之爲與其他變量不同的東西。它會讓你的代碼更容易被其他人理解。

而在你的輸出循環:

for(i = 0; i < 7; i++){ 
    printf("%i\n", *(r + i)); 
} 

雖然這是完全正確的,我個人覺得用r[i]很多超過*(r + i)可讀性。

+0

感謝您的快速回復和所有建議。 – Shaine

+0

@Shaine不客氣。請注意,在Stack Overflow中,如果問題得到解決,問題提問者應該選擇一個可接受的答案(通過按下答案旁邊的綠色複選標記)。當有多個答案時,您可以選擇最能幫助您的答案。我建議接受JohnKugelman的回答,因爲它提到洗牌。 – ace