2014-03-27 106 views
0

我一直在尋找我的問題的答案,但我找不到任何解決方案。 我正在編寫一個程序,其中用戶輸入五名學生的姓名,姓氏和社交號碼。完成後,一個隨機數字將交給用戶輸入的五個學生中的每一個。但問題是兩個學生不能有相同的隨機數。我知道1-10000的機會很低,但這是我的任務。隨機一個唯一的數字到五個對象

這是我的代碼,我試圖解決這個問題,但我不能得到它的工作。

while (antal != ggr) 
{ 
    string name = Interaction.InputBox("Write name: "); 
    string lastname = Interaction.InputBox("Write last name: "); 
    string socialnr = Interaction.InputBox("Write social number: "); 
    while (a != false) 
    { 
     foreach (int item in uniqNum) 
     { 
      if (item == _rnd) 
      { 
       a = true; 
      } 
      else 
      { 
       _rnd = rnd.Next(1, 10000); 
       uniqNum.Add(_rnd); 
       a = false; 
      } 
     } 

    } 

    ggr++; 
    _Studens.Add(new student(name, lastname, socialnr, _rnd)); 
} 
+0

什麼是'uniqNum'? –

+0

我存儲隨機數的列表。 – user3356636

+0

爲什麼不使用[HashSet ](http://msdn.microsoft.com/zh-cn/library/bb359438%28v=vs.110%29.aspx)? –

回答

2

生成一個包含您希望從中選擇的所有隨機數的列表。然後,從該列表中隨機選擇一個索引,將結果數字添加到單獨的列表中,並從所有數字列表中刪除索引元素。

這將適用於較小的數字範圍。如果你想要一個更大範圍內的唯一隨機數,這種方法可能不合適。在這種情況下,請考慮生成GUID並將它們轉換爲它們的128位數字表示形式。

var allNumbers = Enumerable.Range(1, 10000).ToList(); 
var randomNumbers = new List<int>(); 
var random = new Random(); 
const int studentCount = 5; 

for (int i = 0; i < studentCount; i++) 
{ 
    int randomIndex = random.Next(0, allNumbers.Count); 

    randomNumbers.Add(allNumbers[randomIndex]); 
    allNumbers.RemoveAt(randomIndex); 
} 
1

如果您先生成數字,然後使用Contains()方法檢查數字是否已經存在,那麼怎麼辦?如果是,請重新生成號碼。例如:

int number = 0; 
List<int> numberArray = new List<int>(); 
while (true) 
{ 
    Random r = new Random(); 
    number = r.Next(1, 1000); 
    if (!numberArray.Contains(number)) 
    { 
     break; 
    } 
} 
+0

如果很多獨特的數字需要使用HashSet而不是列表是一個好主意。 –

0
Random r = new Random(); 
Enumerable.Range(1,10000).OrderBy(n => r.Next()).Take(5); 
+0

巧妙!與此相關的一個問題是,它需要對整個數字列表進行排序,併爲列表中的每個數字生成一個隨機數。這是比必要的更多的工作。順便說一下,我並沒有讓你失望。 :) – NathanAldenSr