Как работает случайный класс C #

c# random

492 просмотра

2 ответа

Я хотел понять , как C # Random.next()работает , поэтому я начал искать какие - то вещи , и я красный он получает случайное семя от часов , как это: DateTime.Now.Millisecond. Поэтому я подумал, что если вы создадите много объектов Random подряд, они будут выплескиваться с одинаковым номером, я хотел это проверить и создал этот фрагмент кода.

static void Main(string[] args)
        {
            Random rn;
            while (true)
            {
                rn = new Random();
                Console.WriteLine(DateTime.Now.Millisecond.ToString());
                Console.WriteLine(rn.Next(10));
            }

        }

И когда я запустил это, я, конечно, получил много чисел, которые были одинаковыми, но то, что я думал, было, когда DateTime.Now.Millisecondоно изменится, оно также изменит случайное число, но это не тот случай, как вы можете видеть в этом выход.

9
127
9
127
9
127
9
127
9
127
9
127
9
127
9
128
9
128
9
128
9
128
9
128
9

Так почему же случайное число не меняется при DateTime.Now.Millisecondизменении? Обратите внимание, что я только начал изучать C #, поэтому извините, если я сделал много ошибок.

Автор: Gewoo Источник Размещён: 08.11.2019 11:22

Ответы (2)


2 плюса

Решение

В соответствии с исходным кодом конструктор без параметров определяется как:

  public Random() 
    : this(Environment.TickCount) {
  }

Это означает, что он не использует в DateTime.Now.Millisecondкачестве семени, а скорее Environment.TickCountзначение.

Так что если вы напишите свой код так:

Random rn;
while (true)
{
    rn = new Random();
    Console.WriteLine(Environment.TickCount);
    Console.WriteLine(rn.Next(10));
}

Это должно дать ожидаемый результат. Попробуй!

Автор: Sweeper Размещён: 20.08.2016 02:12

0 плюса

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

Каждый раз, когда вы делаете новый Random (), он инициализируется с использованием часов. Это означает, что в тесном цикле вы получаете одно и то же значение много раз. Вы должны сохранить один экземпляр Random и продолжать использовать Next на том же экземпляре.

попробуй это

static void Main(string[] args)
        {
            Random rn= new Random();
            while (true)
            {

                Console.WriteLine(DateTime.Now.Millisecond.ToString());
                Console.WriteLine(rn.Next(10));
            }

    }
Автор: Manu Varghese Размещён: 20.08.2016 01:46
Вопросы из категории :
32x32