Как я могу генерировать действительно (не псевдо) случайные числа с C#?

Вставка обычно объединяет строки нескольких файлов, но она может также использоваться для преобразования отдельных строк файла в одну строку. Флаг разделителя позволяет Вам передавать уравнение типа x+x до н.э

paste -s -d+ infile | bc

, С другой стороны, при передаче по каналу от stdin,

<commands> | paste -s -d+ - | bc
31
задан raven 5 August 2009 в 16:00
поделиться

9 ответов

Ответ здесь имеет две основные стороны. Есть несколько очень важных тонкостей, на которые следует обратить должное внимание ...

Простой способ (для простоты и практичности)

RNGCryptoServiceProvider , который является частью Crypto API в BCL , должен сделать всю работу за вас. Технически это все еще генерируется псевдослучайным числом, но качество «случайности» намного выше - подходит для криптографических целей, как следует из названия.

Существуют и другие крипографические API с высококачественными генераторами псевдослучайных чисел. Такие алгоритмы, как Twister Мерсенна , довольно популярны.

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

Жесткий путь (для высококачественной теоретической случайности)

Чтобы сгенерировать истинно случайных чисел, вам необходимо использовать некоторые естественные явления, такие как ядерный распад, микроскопические колебания температуры (температура процессора - сравнительно удобный источник) и многие другие. Однако это намного сложнее и, конечно, требует дополнительного оборудования. Я подозреваю, что практическое решение ( RNGCryptoServiceProvider или подобное) должно отлично сработать за вас.

Теперь обратите внимание, что если вам действительно нужны действительно случайные числа , вы можете использовать такой сервис, как Random.org , который генерирует числа с очень высокой случайностью / энтропией (на основе атмосферного шума ). Данные находятся в свободном доступе для скачивания. Тем не менее, это может быть излишне сложным для вашей ситуации, хотя, безусловно, дает вам данные, подходящие для научных исследований и еще много чего.

В конце концов, выбор за вами, но, по крайней мере, теперь вы должны быть в состоянии принять информативное решение, зная различных типов и уровней ГСЧ.

56
ответ дан 27 November 2019 в 21:39
поделиться

краткий ответ: невозможно напрямую сгенерировать ИСТИННО СЛУЧАЙНЫЕ ЧИСЛА , используя только C # (т.е. используя только чисто математическую конструкцию).

длинный (э) ответ : Только посредством использования внешнего устройства, способного генерировать "случайность", такого как генератор белого шума или аналогичного - и захвата выходных данных этого устройства в качестве начального числа для генератора псевдослучайных чисел (PRG). Эту часть можно выполнить с помощью C #.

13
ответ дан 27 November 2019 в 21:39
поделиться

Истинные случайные числа могут быть сгенерированы только при наличии действительно случайного физического устройства ввода, обеспечивающего начальное значение для случайной функции.

Существуют ли какие-либо физические и действительно случайные числа, все еще обсуждается (и вероятно, будет долгое время) научным сообществом.

Генераторы псевдослучайных чисел - следующая лучшая вещь, а лучшую очень сложно предсказать.

4
ответ дан 27 November 2019 в 21:39
поделиться

Как пошутил Джон фон Нейман: «Любой, кто рассматривает арифметические методы получения случайных чисел, конечно, находится в состоянии греха»

.
4
ответ дан 27 November 2019 в 21:39
поделиться

Посмотрите на использование такого алгоритма, как Ярроу или Фортуна с накоплением энтропии. Суть этих алгоритмов в том, что они отслеживают энтропию как меру теоретического информационного содержания, доступного для предсказания будущих чисел, зная прошлые числа и алгоритмы, используемые для их получения; и они используют криптографические методы для добавления новых источников энтропии в генератор чисел.

Вам по-прежнему понадобится внешний источник случайных данных (например, аппаратный источник случайных чисел ), будь то время нажатия клавиш, движения мыши, время доступа к жесткому диску, температура процессора или данные веб-камеры, цены на акции или что-то еще - но в любом случае вы продолжаете смешивать эту информацию с пулами энтропии,

2
ответ дан 27 November 2019 в 21:39
поделиться

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

1
ответ дан 27 November 2019 в 21:39
поделиться

Мне всегда нравилась эта идея в стиле ретро 60-х:

Lavarand

1
ответ дан 27 November 2019 в 21:39
поделиться

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

Тем не менее, если у вас нет доступа к такому источнику действительно случайных чисел, вы можете использовать процесс «бедняков», например:

  • Создайте длинный массив (10000 или более элементов?) чисел
  • Заполните массив текущими случайными числами с начальным временем стандартным способом
  • Когда требуется случайное число, сгенерируйте случайный индекс в массив и верните число, содержащееся в эта позиция
  • Создайте новое, текущее случайное число с начальным временем в индексе массива, чтобы заменить используемое число

Этот двухэтапный процесс должен несколько улучшить случайность ваших результатов без необходимости внешнего ввода.

Вот' Библиотека примеров sa, реализующая описанный выше алгоритм на C ++: http://www.boost.org/doc/libs/1_39_0/libs/random/random-generators.html

1
ответ дан 27 November 2019 в 21:39
поделиться

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

1
ответ дан 27 November 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: