Как компьютеры генерируют случайные числа

1104
SemperAmbroscus

Вполне возможно, это единственный вопрос, который я когда-либо задавал на этом сайте stackexchange. В программировании есть много разных способов генерировать случайные числа в зависимости от разных языков. Что меня беспокоило какое-то время сейчас, однако, КАК что-либо генерируемое компьютером может быть случайным? Я нашел этот пост, однако он был не очень хорошо принят, и он сказал, чтобы широкие или многие возможные ответы. Однако, как я вижу, есть только один возможный ответ, как это работает! Я хочу сказать, что кто-то с компьютерным опытом должен ответить на этот вопрос, поэтому я не спрашиваю вашего мнения. В качестве последнего замечания я хотел бы извиниться, если я не на том форуме.

3
Ответы здесь в порядке, но держу пари, что если бы вы спросили об этом на сайте безопасности, вы бы получили много ответов. Безопасное создание случайных чисел крайне важно для шифрования. Это чрезвычайно сложно, и есть огромное разнообразие методов с различной сложностью и производительностью. http://security.stackexchange.com/questions/tagged/prng http://security.stackexchange.com/questions/tagged/random Zoredache 9 лет назад 0

3 ответа на вопрос

3
RedGrittyBrick

Они не

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

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

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

ничего себе, хотя я никогда даже не использовал что-то столь же незначительное, как текущее время в миллисекундах, я просто предполагал, что любой метод, используемый для генерации случайного числа, не может быть случайным. SemperAmbroscus 9 лет назад 0
3
Alex

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

Это означает, что они не могут использовать PRNG для шифрования вашего пароля. PRNG обычно используют системное время в качестве начального числа, поэтому, если злоумышленник знает приблизительное время, когда ваш пароль был зашифрован (время создания учетной записи, время смены пароля), он может просто сгенерировать небольшой диапазон паролей, используя этот временной диапазон, и попробовать все сгенерированные пароли вместо того, чтобы генерировать все возможные комбинации.

Если вы когда-нибудь заходили на www.random.org, вы, вероятно, увидите, что они генерируют действительно случайные числа. Это потому, что они используют устройства для сбора атмосферного шума или каких-либо шумных атмосферных данных и используют его.

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

Хороший PRNG не будет посеян ко времени, но все еще может быть посеян из относительно небольшого количества информации (это непрактично для грубой силы, но иногда можно предположить, если оно исходит из плохого источника). user20574 9 лет назад 2
-2
Callum Ansell

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

public static int[] RandomArray(int RandArrayNValue) {  int[] array = new int[RandArrayNValue];  Random rand = new Random();  for (int i = 0; i < RandArrayNValue; i++) { array[i] = i + 1; }  Console.WriteLine();  for (int i = array.Length - 1; i >= 0; i--) { int Store = rand.Next(i);  int TempStore = array[Store];   array[Store] = array[i];  array[i] = TempStore; Console.WriteLine(" " + array[i]); } return array; } 
ФП знает о том, как случайные числа работают на этом уровне: «В программировании есть много разных способов генерировать случайные числа в зависимости от разных языков». Вопрос в том, как что-либо, поступающее с компьютера, может быть действительно случайным, когда компьютер полностью детерминирован (т. Е. С учетом ввода A мы всегда получаем вывод B). tsleyson 9 лет назад 0
`Random ()` не волшебство - этот вопрос о том, как это работает. NReilingh 9 лет назад 0

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