2014-02-06 72 views
1

大家好我有一個問題,選擇隨機數來刷一副撲克牌。隨機隨機洗牌,我們試圖在每個循環中選擇一張隨機卡,但似乎如果我們用完了一種,我們不能隨機選擇一種。它進入無限循環。有什麼建議麼?在c中挑選隨機數字#

(翻譯:瑪卡=鏟,sinek =俱樂部,KUPA =心臟,卡羅=鑽石,淡水河谷=插孔,KIZ =女王,papaz =國王)

public class KartKarma : MonoBehaviour { 
    public GameObject[] Deste; 
    public static GameObject KupaAs, Kupa2, Kupa3, Kupa4, Kupa5, Kupa6, Kupa7, Kupa8, Kupa9, Kupa10, KupaVale, KupaKiz, KupaPapaz; 
    public static GameObject KaroAs, Karo2, Karo3, Karo4, Karo5, Karo6, Karo7, Karo8, Karo9, Karo10, Karo11, Karo12, Karo13; 
    public static GameObject SinekAs, Sinek2, Sinek3, Sinek4, Sinek5, Sinek6, Sinek7, Sinek8, Sinek9, Sinek10, Sinek11, Sinek12, Sinek13; 
    public static GameObject MacaAs, Maca2, Maca3, Maca4, Maca5, Maca6, Maca7, Maca8, Maca9, Maca10, Maca11, Maca12, Maca13; 
    public GameObject[] Kupa = {KupaAs, Kupa2, Kupa3, Kupa4, Kupa5, Kupa6, Kupa7, Kupa8, Kupa9, Kupa10, KupaVale, KupaKiz, KupaPapaz}; 
    public GameObject[] Karo = {KaroAs, Karo2, Karo3, Karo4, Karo5, Karo6, Karo7, Karo8, Karo9, Karo10, Karo11, Karo12, Karo13}; 
    public GameObject[] Sinek = {SinekAs, Sinek2, Sinek3, Sinek4, Sinek5, Sinek6, Sinek7, Sinek8, Sinek9, Sinek10, Sinek11, Sinek12, Sinek13}; 
    public GameObject[] Maca = {MacaAs, Maca2, Maca3, Maca4, Maca5, Maca6, Maca7, Maca8, Maca9, Maca10, Maca11, Maca12, Maca13}; 
    List<GameObject> deste = new List<GameObject>(); 

// Use this for initialization 
void Start() { 
    int i = 0; 
    while(i < 26){ 
     int a = Random.Range(1,5); 
     if (a == 1) { 
      int b = Random.Range(0,13); 
      if(Maca != null){ 
       while(Maca[b] == null){ 
        b = Random.Range(0,13); 
       } 
       deste.Add(Maca[b]); 
       Maca[b] = null; 
      } 
      else { 
       while(a == 1) 
        a = Random.Range(2,5); 
      } 
     } 

     if (a == 2) { 
      int b = Random.Range(0,13); 
      if(Sinek != null){ 
       while(Sinek[b] == null) 
        b = Random.Range(0,13); 
       deste.Add (Sinek[b]); 
       Sinek[b] = null; 
      } 
      else { 
       while(a == 2) 
        a = Random.Range(1,5); 
      } 
     } 

     if (a == 3) { 
      int b = Random.Range(0,13); 
      if(Karo != null){ 
       while(Karo[b] == null) 
        b = Random.Range(0,13); 
       deste.Add (Karo[b]); 
       Karo[b] = null; 
      } 
      else { 
       while(a == 3) 
        a = Random.Range(1,5); 
      } 
     } 

     if (a == 4) { 
      int b = Random.Range(0,13); 
      if(Kupa != null){ 
       while(Kupa[b] == null){ 
        b = Random.Range(0,13); 
       } 
       deste.Add(Kupa[b]); 
       Kupa[b] = null; 
      } 
      else { 
            while(a == 4) 
        a = Random.Range(1,5); 
      } 
     } 
     i++; 
    } 
} 

void Update() { 

} 

}

+2

什麼是Random.Range?通常,不要在方法中創建新的隨機實例,而是重新使用實例變量或將其作爲參數傳遞。否則,你會得到相同的值,因爲隨機會被循環中重複調用的當前時間播種。 –

+0

代表'Random.Range'使用'Random.Next'然後嘗試。 –

+0

此外,您的代碼只處理1到4的'a',而Range方法則發送參數1和5,無論它們是什麼意思。你從哪裏得到那5個? – Tarec

回答

3

使用合適的洗牌算法,如Knuth's (aka Fisher-Yates)

/// <summary>Used to shuffle collections.</summary> 

public class Shuffler 
{ 
    /// <summary>Shuffles the specified array.</summary> 
    /// <typeparam name="T">The type of the array elements.</typeparam> 
    /// <param name="array">The array to shuffle.</param> 

    public void Shuffle<T>(IList<T> array) 
    { 
     for (int n = array.Count; n > 1;) 
     { 
      int k = _rng.Next(n); 
      --n; 
      T temp = array[n]; 
      array[n] = array[k]; 
      array[k] = temp; 
     } 
    } 

    private readonly Random _rng = new Random(); 
} 

然後:

var shuffler = new Shuffler(); 
... 
shuffler.Shuffle(deste); 

由於@Paul發佈的鏈接確實表明 - 請注意,Random不是一個特別好的隨機數生成器。如果你願意,你可以用一個更好的替代,但底層洗牌算法保持不變。

+0

此代碼不返回混洗的數組? – Max

+1

@MaxMommersteeg這是一個就地洗牌。 –

+0

所以名爲'deste'的套牌在呼叫者級別是shuffeld嗎? – Max

0

我認爲有

while(a == 1) 
while(a == 2) 
while(a == 3) 
while(a == 4) 

線導致此問題。請重新檢查你的邏輯。

2
while(a == 1) 
    a = Random.Range(2,5); 

這是你的無限循環原因。此外,該部分:

while(Sinek[b] == null) 
    b = Random.Range(0,13); 

也是討厭的,因爲它不能保證條件將永遠滿足。