2015-11-04 76 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; 
     } 
    } 
}