Случайно выбрать 4 элемента из массива, используя c # - PullRequest
1 голос
/ 17 ноября 2011

Я пытаюсь использовать случайную функцию в C #, чтобы случайным образом выбрать четыре из массива addetailsID, который имеет более шести элементов.

Я помещаю эти случайно выбранные в другой массив strAdDetailsID:

 string[] strAdDetailsID = new string[4];
 for (int i = 0; i < 4; i++)
 {
     Random random = new Random();
     int index = random.Next(0, addetailsID.Length);
     value = addetailsID[index].ToString();
     strAdDetailsID[i] = value;
 }

Иногда я получаю два одинаковых значения из шести элементов.Как я могу получить все четыре уникальных значения для выбора?

Ответы [ 8 ]

6 голосов
/ 17 ноября 2011

Вам может быть лучше перетасовать массив, а затем выбрать первые 4 элемента.

5 голосов
/ 17 ноября 2011

Вы можете сделать это с помощью LINQ этим методом.

List<string> list = new List<string>() { "There", "Are", "Many", "Elements", "To", "Arrays" };

foreach (var item in list.OrderBy(f => Guid.NewGuid()).Distinct().Take(4))
{
    Console.WriteLine(item);
}
3 голосов
/ 17 ноября 2011

У вас есть проблема с вашим размещением Random random ..., но я считаю, что вы атакуете это неправильно.

Эту проблему можно решить, выбрав случайный порядок источника и взяв первые 4 элемента.*

var result = addetails.OrderBy(x => Guid.NewGuid()).Take(4).ToArray();

Предполагая, что содержимое addetails уникально (как вы и предполагали), вы всегда получите здесь 4 уникальных значения.При правильном использовании random все еще возможно получить повторы (потому что это random ).

2 голосов
/ 17 ноября 2011

Сначала необходимо сгенерировать 4 уникальных индекса, а затем извлечь случайные значения из исходного массива:

        string[] addetailsID = new string[20];  // this is the array I want to index into
        // generate the 4 unique indices into addetailsID
        Random random = new Random();
        List<int> indices = new List<int>();
        while (indices.Count < 4)
        {
            int index = random.Next(0, addetailsID.Length);
            if (indices.Count == 0 || !indices.Contains(index))
            {
                indices.Add(index);
            }
        }
        // now get the 4 random values of interest
        string[] strAdDetailsID = new string[4];
        for (int i = 0; i < indices.Count; i++)
        {
            int randomIndex = indices[i];
            strAdDetailsID[i] = addetailsID[randomIndex];
        }
2 голосов
/ 17 ноября 2011

Поместите их в список и удалите выбранный элемент из списка, как только он был выбран.

1 голос
/ 17 ноября 2011

Следующий алгоритм работает довольно хорошо, и не требует дополнительного места для хранения или предварительного перемешивания. Это действительно меняет порядок исходного массива, поэтому, если это неосуществимо, тогда лучше использовать метод предварительного перемешивания.

В псевдокоде:

result = []
For i = 0 to numItemsRequired:
    randomIndex = random number between i and source.length - 1
    result.add(source[randomIndex])
    swap(source[randomIndex], source[i])

В C #:

string[] strAdDetailsID = new string[4];
Random rand = new Random();

for (int i = 0; i < 4; i++)
{
    int randIndex = rand.Next(i, adDetailsID.Length);
    strAddDetails[i] = adDetailsID[randIndex];

    string temp = adDetailsID[randIndex];
    adDetailsID[randIndex] = adDetailsID[i];
    adDetails[i] = temp;
}
0 голосов
/ 17 ноября 2011

Вместо этого используйте список и отбросьте каждый уже использованный элемент:

 List<string> addetailsID = new List<string>{"1","2","3","4","5","6"};

 string[] strAdDetailsID = new string[4];
 Random random = new Random();
 for (int i = 0; i < 4; i++)
 {

     int index = random.Next(0, addetailsID.Count);
     string value = addetailsID[index].ToString();
     addetailsID.RemoveAt(index);
     strAdDetailsID[i] = value;
 }

  strAdDetailsID.Dump();
0 голосов
/ 17 ноября 2011

Ну, вы должны выбирать случайные предметы по одному, не учитывая уже выбранные предметы при выборе следующего. Это должно быть быстрее, чем тасование.

Если список источников небольшой, вы можете просто сделать копию и удалить из нее выбранные элементы. В противном случае вы идете так:

(пусть n будет количеством элементов в вашем массиве)

  1. пусть S будет набором выбранных индексов; S = пусто в начале
  2. выберите случайный индекс i от 0 до n-1-size(S)
  3. для каждого индекса из S, который меньше i (начиная с наименьшего индекса!), Добавьте его к i
  4. сейчас i - выбранный индекс, добавьте его к S.
  5. возвращайтесь к шагу 2, пока в вашем наборе не будет 4 элемента.
...