2017-03-23 67 views
-1

我設法做出一個應用程序,隨機生成一個選定數量的數字,並把所有的數字放在一個富文本框中(結果我會得到從1到100 10個數字是'67,55,28,35,7,69,47,59,69,82'。但是,我想添加一個選項,您可以選擇是否希望數字是唯一的(複選框)盒子是接近最大數量箱,數量往往重複。C#隨機數生成器與唯一編號

我也不太清楚如何做到這一點,雖然,我曾嘗試在網上尋找,但大部分的答案對我來說有點太複雜了。

我到目前爲止的代碼(C#Windows Form App FYI):

int minComplexNumber = Convert.ToInt32(minComplexTextBox.Text); 
int maxComplexNumber = Convert.ToInt32(maxComplexTextBox.Text); 
int intergersNumber = Convert.ToInt32(intergersTextBox.Text); 
int numbersLeft = intergersNumber; 
resultComplexTextBox.Text = ""; 

if (UniqueCheckBox.Checked) 
{ 
    //Need something here 
} 
else 
{ 
    Random comrnd = new Random(); 
    while (numbersLeft > 1) 
    { 

     int complexResult = comrnd.Next(minComplexNumber, maxComplexNumber); 
     resultComplexTextBox.Text += complexResult + ", "; 
     numbersLeft = numbersLeft - 1; 
    } 

    if (numbersLeft == 1) 
    { 
     int complexResult = comrnd.Next(minComplexNumber, maxComplexNumber); 
     resultComplexTextBox.Text += complexResult; 
     numbersLeft = numbersLeft - 1; 
    } 
} 

有關如何獲取唯一編號的任何建議?

+1

你隨機能將所有可能的數字清單進行混洗,然後取前10個。或者可以存儲「已經選擇的」隨機數並比較列表中的新數。 – David

+0

這與隨機生成器無關,但在列表中查找生成的數字,如果找到,則丟棄它並生成另一個。 –

回答

1

使用List<int>存儲可用號碼的名單,然後採取並刪除你從那裏需要儘可能多的:

//if checked... 
Random comrndu = new Random(); 
var available = Enumerable.Range(minComplexNumber, (maxComplexNumber - minComplexNumber) + 1).ToList(); 
while (numbersLeft-- > 0) 
{ 

    int idx = comrndu.Next(0, available.Count); 
    int complexResult = available[idx]; 
    available.RemoveAt(idx); 
    resultComplexTextBox.Text += complexResult + ", "; 
} 
resultComplexTextBox.Text = resultComplexTextBox.Text.Substring(0, resultComplexTextBox.Text.Length - 2); 
0

快速和骯髒的解決方案:生成號碼,並把它變成列表(如果它不已經存在)。 完成後,將所有數字寫入texbox。

David在評論中建議的解決方案更好。這是,我再說一遍,快速和骯髒的,並可以幫助你,如果有沒有多的數字產生

if (UniqueCheckBox.Checked) 
{ 
    Random comrnd = new Random(); 
    List<int> generatedNumbers = new List<int>(); 

    while (numbersLeft > 0) 
    { 

     int complexResult = comrnd.Next(minComplexNumber, maxComplexNumber); 
     if (!generatedNumbers.Contains(complexResult)){ 
      generatedNumbers.Add(complexResult); 
      numbersLeft = numbersLeft - 1; 
     } 
    } 
    resultComplexTextBox.Text += string.Join(", ", generatedNumbers.ToArray()); 

} 
1

我喜歡@David建議,你可以像這樣的東西去:

var random = new Random(); 
var possibilities = Enumerable.Range(1, 100).ToList(); 
var result = possibilities.OrderBy(number => random.Next()).Take(10).ToArray(); 
Console.WriteLine(String.Join(",", result));