2013-01-18 28 views
3

這基本上都是標題。這很簡單,但我不知道爲什麼我的While循環有時會失敗。時不時地,我會得到一個列表,是不是3生成0到9之間三個唯一編號列表的最佳方法

這裏長度爲2的是我的C#代碼:

public List<int> generateRequiredSecretCode() 
{ 
    List<int> placeHolder = new List<int>(); 
    Random random = new Random(); 
    int randomNo = random.Next(0, 10); 
    while (!placeHolder.Contains(randomNo) && placeHolder.Count != 3) 
    { 
     placeHolder.Add(randomNo); 
     randomNo = random.Next(0, 10); 
    } 
    return placeHolder; 
} 

我的目標總結:我想整數這是一個名單的長度3並在列表中的每個數字是9獨特介於0和是

+1

對不起,我只是...無法抗拒:'回報新名單{0,1,2};'。對不起,我的壞,你想要r我知道。 =) – Jens

+0

如果這是您唯一使用隨機數生成的標準。 {1,2,3}是否符合所有3個要求? –

+0

我已經在linqpad中運行了這個功能 - 我有時會得到1個條目。 – Oded

回答

3

!placeHolder.Contains(randomNo)因爲結束而如果列表中包含randomNo這裏是你的問題。 檢查!placeHolder.Contains(randomNo)在內部,如果是這樣的:

while (placeHolder.Count != 3) 
{ 
    if(!placeHolder.Contains(randomNo)) 
     placeHolder.Add(randomNo); 
    randomNo = random.Next(0, 10); 
} 
7

您可以使用

var random = new Random(); 
return Enumerable.Range(0,10).OrderBy(i => random.NextDouble()).Take(3).ToList(); 
+0

這是一個非常漂亮的解決方案。我不知道它會提供不同的數字。 – Moriya

0

因爲,在罕見的情況下,當Rand.Next不會返回它有時會失敗,一個整潔的LINQ兩班輪與列表中已存在的相同編號!placeHolder.Contains(randomNo)將返回false; false & & anything = false,所以循環結束。如果你運行它足夠長的時間,你會最終得到長度爲1的清單;)

可能替代:

List<int> placeHolder = new List<int>(); 
Random random = new Random(); 
int randomNo; 
do { 
    randomNo = random.Next(0, 10); 
    if (!placeHolder.Contains(randomNo) && placeHolder.Count != 3) 
    { 
     placeHolder.Add(randomNo); 
     randomNo = random.Next(0, 10); 
    } 
} while (placeHolder.Count < 3); 
return placeHolder; 

[編輯]:這個線程快速移動......與動物的解決方案比我:(

0

有點遲到了,但設定算術顯得相當優雅所以忍不住要好得多:

private static Random RNG = new Random(); 

... 

public static List<int> RandomNumbers() { 
    var numbers = new HashSet<int> { RNG.Next(0, 9), RNG.Next(0, 9), RNG.Next(0, 9) }; 
    while (numbers.Count < 3) 
    { 
    numbers.Add(RNG.Next(0, 9)); 
    } 

    return numbers.ToList(); 
}