Генератор множества не повторяющихся целых чисел

В компьютерном тестировании часто возникает необходимость выбрать из большого массива Nm вопросов некоторое меньшее количество Nq случайным образом. Существенно, чтобы эти вопросы не повторялись. Если Nm=Nq, то должны быть заданы все вопросы в случайном порядке. Или использовать его в игре.

Я использую такой генератор случайных чисел (элементы, как и всегда в С,  нумеруются с нуля):

 using System;
namespace генераторНеПовторяющихсяЦелыхЧисел
{
   class Program
   {

Метод GenSetN генерирует множества Nq не повторяющихся целых чисел в диапазоне от 0 до Nm-1. Добавьте его в свое пространство имен проекта и используйте его сколько нужно раз. Если Вам нужно сгенерировать массив qN[] из 3 неповторяющихся чисел в диапазоне от 0 до 7, то нужно просто вызвать метод GenSetN(3,8);

static int GenSetN(int Nq, int Nm, int[] qN)
   {

Если зададим Nq>Nm, то выполнится перестановка, и тогда Nq < Nm. Это некоторая «защита от дурака», совсем не обязательная в Вашей программе

   int p;
   if (Nq > Nm)
      {
         p = Nm;
         Nm = Nq;
         Nq = p;
      }

Создаем объект класса Random и задаем цикл while по k (нам нужно сгенерировать Nq различных целых чисел!). Булевская переменная b — индикатор факта, что новое число отсутствует в формирующемся массиве

Random r = new Random();
      int k = 0;
      while (k < Nq)
      {
         p = r.Next(Nm); // новое число
         bool b = true;
         // Проверка, имеется ли уже такое число в массиве
         for (int i = 0; i < k; i++)
            if (p == qN[i])
            {
               b = false;
               break; // досрочный выход из цикла for, если такое число уже имеется в массиве
            }

Если такого числа нет, то добавим его в наш массив:

         if (b)
         {
            qN[k] = p;
            k++;
         }
      }  // конец цикла while
      return Nq;  // возврат Nq - фактическая длина массива
   }

Проверку метода GetSetN можно сделать, например, так:

static void Main(string[] args)
        {
            int Nq = 25;
            int Nm = 50;   // не больше 100 !
            int[] qNumber = new int[100];   // Результат
            Nq = GenSetN(Nq, Nm, qNumber);
            for (int i = 0; i < Nq; i++)
                Console.Write(" {0} ", qNumber[i]);
            Console.ReadKey();
        }
    }
}

Имея такой массив, легко организовать выбор вопросов из всего множества вопросов тестирования.


NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.


Помощь проекту:

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
2 комментариев
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Не могли бы вы лучше разъяснить логику работы Генератор множества не повторяющихся целых чисел. Добавить больше комментариев в код и что означают переменные

Важно: Вы можете поддержать проект и автора.
2
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x