Как генератор случайных чисел работает?

См. сообщение Joel на Законе Текучих Абстракций

JoelOnsoftware

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

Что касается сокрытия информации, я соглашаюсь с jamting.

34
задан Jason Punyon 11 November 2009 в 16:28
поделиться

4 ответа

Следует иметь в виду, что не существует «истинных» генераторов случайных чисел. Они просто генерируют числа, которые выглядят случайными для нас, простых смертных.

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

Конечно, некоторые генераторы, такие как Blum Blum Shub , непредсказуемы даже для постороннего человека. если он применяет серьезные математические навыки и вычислительную мощность к задаче, но на фундаментальном уровне генераторы случайных чисел не случайны; они регулярны и предсказуемы.

18
ответ дан 27 November 2019 в 17:00
поделиться

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

Следующее, что вам нужно сделать, это применить некоторую формулу, которая будет генерировать новое число из этого «входного» числа и обрезать его до нужного вам диапазона, например 0..255:

random_number = integer (формула (значение таймера)) MOD 255

Таким образом, у вас будет новое «случайное» число каждый раз, когда вы вызываете функцию.

Пример функции формулы может быть:
формула (x) = ((x XOR constant) + constant2) Диапазон MOD
Раньше XOR был одним из моих любимых.


Обновление: Я понимаю, что эта формула очень плохая, она генерирует довольно предсказуемый набор чисел. К тому же системный таймер как источник слишком предсказуем. Так что для большинства приложений этого недостаточно. Если вам нужна лучшая случайность, используйте больше источников, чем просто системный таймер и лучшие формулы , чтобы объединить их.

5
ответ дан 27 November 2019 в 17:00
поделиться

Нет. Вам необходимо знать схему таблицы, чтобы правильно написать оператор вставки.

Вы должны быть в состоянии написать оператор в форме:

3
ответ дан 27 November 2019 в 17:00
поделиться

Существует много информации о том, как они работают ... см. Ответ Konamiman и немного воспользуйтесь Google.

Почему вы хотели бы написать новый генератор случайных чисел? Вам, вероятно, не стоит пытаться это сделать ... пока вам не понадобится что-то особенное. Например, в игре вы можете использовать случайный мешок , который выдает «справедливые» случайные значения - посмотрите этот интересный вопрос по SO .
Я размещаю это здесь, потому что мне очень понравилась идея и реализация, когда я впервые прочитал об этом :)

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

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