2015-11-04 3 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 для List (хотя есть примеры этого). В основном создайте список всех возможных целых чисел, заполните список, затем отсортируйте по новым идентификаторам 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

Split ваша проблема в двух:

  1. Создать список X случайных, уникальных номеров. Существует множество способов сделать это:

    a. Создайте список всех номеров 0-100, а затем shuffle them. OR

    b. Сохраните хэш-набор всех номеров, которые вы уже создали (в дополнение к списку), и добавьте только новый, если он еще не был добавлен ранее.

  2. Впоследствии циклически просматривайте список и строки данных одновременно и вставьте значения в строки.

+0

Список должен быть [HashSet] (https://msdn.microsoft.com/es-es/library /bb359438(v=vs.110).aspx) –

+2

@MatiasCicero: Я так не думаю: хешсет не имеет определенного порядка, поэтому перетасовка невозможна. – Heinzi

+0

Но как вы гарантируете уникальность? –

0

Вам нужно будет сравнить числа, которые вы уже использовали, к следующему из случайных. Далее. Если вы уже использовали его, выберите другой. Мне также нравится ответ Хейнзи.

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; 
     } 
    } 
} 
Смежные вопросы