Главная страница
Навигация по странице:

  • Генерация неповторяющейся последовательности чисел

  • Перемешивание значений

  • Лекция. Генератор случайных чисел. Генератор случайных чисел


    Скачать 38.92 Kb.
    НазваниеГенератор случайных чисел
    АнкорЛекция
    Дата08.05.2022
    Размер38.92 Kb.
    Формат файлаdocx
    Имя файлаГенератор случайных чисел.docx
    ТипПрограмма
    #518176

    Генератор случайных чисел

    Очень часто в программах возникает необходимость использования случайных чисел - от заполнения массива до криптографии. Для получения последовательности случайных чисел в языке C# имеется класс Random. Этот класс предусматривает два конструктора:

    • Random() - инициализирует экземпляр класса Random с помощью начального значения, зависящего от текущего времени. Как известно, время может быть представлено в тиках - 100-наносекундных импульсах, начиная с 1 января 0001 года. И значение времени в тиках представляет собой 64-битное целое число, которое и будет использоваться для инициализации экземпляра генератора случайных чисел.

    • Random(Int32) - инициализирует экземпляр класса Random с помощью указанного начального значения. Такая инициализация генератора случайных чисел может быть удобна на этапе отладки программы, поскольку в этом случае при каждом запуске программы будут генерироваться одни и те же "случайные" числа.

    Основным методом данного класса является метод Next(), позволяющий получить случайное число и имеющий ряд перегрузок:

    • Next() - возвращает случайное целое неотрицательное число формата Int32.

    • Next(Int32) - возвращает случайное целое неотрицательное число, которое меньше указанного значения.

    • Next(Int32 min, Int32 max) - возвращает случайное целое число в указанном диапазоне. При этом должно соблюдаться условие min

    А также методы

    Пример программы, выводящей 100 случайных чисел в диапазоне от -100 до 100.



    Генерация неповторяющейся последовательности чисел


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

    using System;
    namespace MyProgram
    {
      class Program
      {
        static void Main(string[] args)
        {
          Random rnd = new Random();
          int[] a = new int[100];
          a[0] = rnd.Next(0, 101);
          for (int i = 1; i < 100;)
          {
            int num = rnd.Next(0, 101); // генерируем элемент
            int j;
            // поиск совпадения среди заполненных элементов
            for (j = 0; j < i; j++)
            {
              if (num == a[j])
                break; // совпадение найдено, элемент не подходит
            }
            if (j == i)
            { // совпадение не найдено
              a[i] = num; // сохраняем элемент
              i++; // переходим к следующему элементу
            }
          }
          for (int i = 0; i < 100; i++)
          {
            Console.Write("{0,4} ", a[i]);
            if (i % 10 == 9)
              Console.WriteLine();
          }
          Console.ReadKey();
        }
      }
    }

    Перемешивание значений


    Часто возникает задача расставить уже имеющийся набор значений в произвольном порядке. С этой целью также используется генератор случайных чисел. Для решения этой задачи создается массив и заполняется значениями, которые необходимо расставить в произвольном порядке.
    После этого генерируется два значения индексов массива случайным образом, и значения элементов с полученными индексами меняются местами. Процедура повторяется не менее N/2 раз, где N - количество элементов массива.

    using System;
    namespace MyProgram
    {
      class Program
      {
        static void Main(string[] args)
        {
          Random rnd = new Random();
          int[] a = new int[100];
          for (int i = 0; i < 100; i++)
            a[i] = i;
          for (int i = 0; i < 50; i++)
          {
            int i1 = rnd.Next(0, 100); // первый индекс
            int i2 = rnd.Next(0, 100); // второй индекс
            // обмен значений элементов с индексами i1 и i2
            int temp = a[i1];
            a[i1] = a[i2];
            a[i2] = temp;
          }
          Console.WriteLine("Значения элементов");
          for (int i = 0; i < 100; i++)
          {
            Console.Write("{0,4} ", a[i]);
            if (i % 10 == 9)
              Console.WriteLine();
          }
          Console.ReadKey();
        }
      }
    }


    написать администратору сайта