2015-11-04 116 views
0

我想獲得X號的隨機數(其中X是一個變量)介於0和100之間,並將它們添加到DataGridView中的行。我使用下面的代碼,但問題是我需要它不可能有兩次相同的數字。有沒有辦法確保我得到獨特的隨機數字?c#獨特的隨機數

int X = 20; 
Random random = new Random(); 
int randomrow = random.Next(0, 100); 

for (int i = 0; i < X; i++) 
{ 
    int randomNumber = random.Next(0, 100); 
    data.Rows[randomrow][3] = randomNumber; 
} 

感謝您的幫助!

+1

使用列表握住你的隨機值。當你生成一個新的檢查它是否存在於該列表中並且如果它存在,則生成一個新的檢查,然後將它們全部添加到DataGridView –

+0

你想要'randomrow'是唯一的嗎?或'randomNumber'? –

+2

[生成隨機,唯一值C#]的可能重複(http://stackoverflow.com/questions/14473321/generating-random-unique-values-c-sharp) – FabioG

回答

0

下面是簡單的方法來做到這一點,而無需爲列表創建一個shuffle方法(雖然有這樣的例子)。基本上創建一個所有可能的整數列表,填充列表,然後按新的GUID進行排序。

 int X = 20; 
     var RowNumbers = new List<int>(); 

     for (int i = 0; i < X; i++) 
      RowNumbers.Add(i); 

     foreach (int i in RowNumbers.OrderBy(f => Guid.NewGuid())) 
     { 
      data.Rows[i][3] = i; 
     } 
6

分割你的問題有兩種:

  1. 創建X隨機的唯一號碼的列表。有很多方法可以做到這一點:

    a。創建一個所有數字0-100列表,然後shuffle them。或

    b。保留已經創建的所有數字(除列表外)的哈希集合,並且只添加一個新的數字(如果它之前沒有添加過)。

  2. 然後,同時遍歷列表和數據行並將值插入行中。

+0

列表應該是[HashSet](https://msdn.microsoft.com/es-es/library /bb359438(v=vs.110).aspx) –

+2

@MatiasCicero:我不這麼認爲:hashset沒有定義的順序,所以不可能進行混洗。 – Heinzi

+0

但你如何保證唯一性? –

0

您需要將您已經使用的數字與random.Next得到的下一個數字進行比較。如果您已經使用過,請選擇另一個。我也喜歡Heinzi的回答。

0

下面是使用無洗牌和以前的結果算法:

var max = 100; // max available value 
var count = 20; // number of random numbers 

var random = new Random(); 
var rest = (double)max; 
for (int i = 0; i < max; i++, rest--) 
{ 
    if (count/rest > random.NextDouble()) 
    { 
     Console.WriteLine(i); // here is your random value 
     count--; 

     if (count == 0) 
     { 
      break; 
     } 
    } 
}