Вопрос

Я проводил некоторое тестирование класса Random и использовал следующий код:

while (x++ <= 5000000)
{
    y = rnd.Next(1, 5000000);
    if (!data.Contains(y))
        data.Add(y);
    else
    {
        Console.WriteLine("Cycle {2}: Repetation found for number {0} after {1} iteration", y, x, i);
        break;
    }
}

Я продолжал изменять максимальный предел rnd (т. е.5000000) и я изменил количество итераций и получил следующий результат:

1) if y = rnd.Next(1, 5000) : The average is between 80 to 110 iterations
2) if y = rnd.Next(1, 5000000) : The average is between 2000 to 4000 iterations
3) if y = rnd.Next(1, int.MaxValue) : The average is between 40,000 to 80,000 iterations.

Почему я получаю эти средние значения, т.е.из 10 раз, когда я проверял каждое значение, в 80% случаев я попадал в этот средний диапазон.Я не думаю, что мы можем назвать это близким к Случайности.

Что я могу сделать, чтобы получить достаточно случайное число?

Это было полезно?

Решение

Вы не проверяете циклы.Вы проверяете, сколько времени потребуется, чтобы получить случайное число, которое у вас было раньше.Это полностью отличается.Ваши цифры подходят для проверки того, сколько времени потребуется, чтобы получить случайное число, которое у вас было раньше.Посмотрите в Википедии в разделе «Парадокс дня рождения» диаграмму вероятности столкновения после определенного количества итераций.

По совпадению, на прошлой неделе я написал статью в блоге именно на эту тему.Он выйдет в свет 22 марта; смотри мой блог тогда подробности.

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

Однако длина цикла — не единственная мера качества генератора псевдослучайных чисел.Помните, ГПСЧ не случайный, они есть предсказуемый, и поэтому вам нужно очень тщательно подумать о том, какова ваша метрика «случайности».

Дайте нам более подробную информацию:почему тебя волнует, насколько «случайным» является Рэндом?Какое приложение вы используете, что вас волнует?Какие аспекты случайности важны для вас?

Другие советы

Вы предполагаете, что случайность выше, если числа не повторяются.Это неправда.

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

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

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

Вы судите о случайности по повторяющимся парам, а это не лучший тест на случайность.Повторы, которые вы видите, сродни парадоксу дня рождения: http://en.wikipedia.org/wiki/Birthday_problem, где повторяющееся событие может произойти при небольшом размере выборки, если вы не ищете конкретное событие.

Согласно документации по адресу http://msdn.microsoft.com/en-us/library/system.random.aspx

Чтобы сгенерировать криптографически безопасное случайное число, подходящее для создания случайного пароля, например, используйте класс, производный от Система.Безопасность.Криптография ..::.Генератор случайных чисел такие , как Система.Безопасность.Криптография ..::.RNGCryptoServiceProvider.

Компьютер не может сгенерировать реальное случайное число.если вам нужно реальное случайное число (Дэвид дал вам лучший вариант из dot net framework) вам нужен внешний случайный источник.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top