Компьютеры не из ниоткуда создают случайные числа без основы, поскольку, скорее всего, время является универсальной основой случайности.
Я хочу, чтобы вы создали код, который создает случайные числа с этими правилами:
- Время не может быть основой в любой точке программы.
- Предопределенные случайные / псевдослучайные функции не допускаются.
- Сгенерированные числа могут быть в любом диапазоне. Ну хотя бы два разных целых числа: D
- Числа повторяются.
popularity-contest
Dadan
источник
источник
Ответы:
JavaScript
Это было весело!
Я написал Twister Мерсенна в JS. Затем я понял, что мне нужно откуда-то получить семена.
Итак, я решил, что получу это из Stack Exchange API! (Я мог бы использовать
localStorage
и увеличивать счетчик, но это не весело.) Итак, я взял 10 самых последних активных ответов, а затем просто взял каждые 4 или менее последовательных цифр в ответе и добавил их.Эти начальные значения всегда различаются, поскольку переполнение стека постоянно обновляется (и моя квота продолжает уменьшаться!). В число входят идентификаторы ответов, идентификаторы вопросов, баллы, количество повышений / понижений, количество повторений / идентификаторов владельца и данные обертки (квота и т. Д.). ). За один прогон я попал
256845
, потом270495
, и256048
тд ....Это записывает 10 случайных 32-битных чисел с двумя дополнениями на консоль. Пример вывода:
источник
Ява
Магия в
public NoTimeRandom()
. Массивы, приведенные к строкам, могут запутать новых программистов, так как числа случайны. Образец (дляchar[]
:)[C@4a8e91eb
.next
Метод копируется изjava.util.Random
.Пример вывода:
Давайте проверим эффективность этой рнг:
В моем ответе « Приблизительная кривая колокольчика» генерация данных, которую я использовал, зависит от хорошего качества. Давайте запустим это как rng. Вывод:
Как я и думал. Это довольно паршивый рнг.
источник
С
Скомпилируйте с флагом -pthread (или с тем, что использует ваш компилятор).
Я не уверен, соответствует ли это стандарту «время не разрешено», потому что он в основном использует планировщик в качестве источника энтропии, преднамеренно игнорируя безопасность потоков. Он работает с использованием довольно простой псевдослучайной функции ( генератора случайных чисел Лемера ) с жестко закодированным начальным начальным числом . Затем он запускает 20 потоков, которые все выполняют вычисление Лемера с общим набором переменных.
Кажется, работает довольно хорошо, вот несколько последовательных прогонов:
РЕДАКТИРОВАТЬ: Дайте немного больше думать и понял, что это не на основе времени вообще. Даже с полностью детерминированным планировщиком энтропия не исходит из временных интервалов - она зависит от загрузки всех запущенных процессов в системе.
РЕДАКТИРОВАТЬ 2 После того, как @Quincunx опубликовал кривую колокольчика, я скопировал 12 МБ случайности в файл и загрузил его в CAcert . Он провалил все несгибаемые тесты, но набрал приличный 7.999573 из 8 в тесте ЛОР (только потенциально детерминированный). Любопытно, что удвоение количества потоков ухудшило ситуацию.
источник
С
Он генерирует случайное число в диапазоне 0-255, беря начальное число из https://stackoverflow.com/questions, используя
wget
.Образец прогона:
источник
C ++
вывод
любые 5 случайных чисел
три образца
источник
11230576, 0, 11206992, 0, 2053725299
, которые мне пока не кажутся случайными.Perl
Что за хлам с получением семян через интернет? Звучит как измена для меня ;-) Я предпочитаю вместо этого отдавать свое начальное значение криптографической хеш-функции и выводить в диапазоне от 0 до 2 ^ 160-1 примерно так:
В любое время, когда у вас есть энтропия неопределенного качества, способ распределять ее более регулярно (но не повышать ее качество!) - это направить ее на SHA1 или MD5 или около того, как я это сделал здесь. Для предварительного хэширования я использовал pid и адрес случайной ссылки. Конечно, вы можете добавить другие входные данные для большей энтропии, например, на x86 вы можете использовать TSC - (но встраивание ассемблерного кода в perl - это немного не так, поэтому я его пропустил).
Если вы хотите, чтобы вывод на другой компьютер был другим, просто настройте «some_salt» так, чтобы он вам нравился. Или вообще не включайте, если вы минималист =)
источник
Ява
Мое решение злоупотребляет
hashCode()
методомObject
класса.Пример вывода:
По мотивам другого ответа, демонстрирующего случайность решения, я изменил свое решение, чтобы вернуть средние 16 битов
int
возвращенного значенияObject.hashCode()
.Я сгенерировал файл размером 19 МБ (состоящий из 10 7
short
) и отправил его в CACert . Вот скриншот результата (он был отредактирован, чтобы хорошо выглядеть, но цифры остались без изменений):Я был удивлен результатом, так как он проверяет 7.999991 на тесте Entropy и проходит (?) Все 7 тестов Diehard.
источник
Javascript
Генерация случайных с движением мыши
Последние пять скопированных данных:
9637090187003
7828470680762
6045869361238
4220720695015
2422653391073
источник
Bash, диапазон: целые числа от 0 до 1
источник
echo -n & echo $!
сделаю, но будет очень плохой ГСЧ. Вы также можете изменить 2 на любое другое число, но чем больше число, тем хуже становится «случайность».Рубин
К сожалению, только Mac. Мы используем,
sox
чтобы вытащить байты из микрофона (как строка, хм ...), повернуть его вспять, чтобы получить заголовок статуса в конце (* кашель *), порубить его, отрубить заголовок, взять MD5 из кусков , вычеркните нечисловые символы из хеша, сложите оставшиеся целые числа больших чисел вместе, вставьте0.
переднюю часть, преобразуйте в число с плавающей точкой, готово.Создает поплавки различной длины на интервале
0..1
.источник
С
Генерация случайных с использованием идентификатора процесса.
Пример вывода:
источник
ВРАЩЕНИЕ
Если бы это было Код-гольфя бы победил!
источник
питон
Краткость Python не перестает удивлять. Поскольку использование случайного изображения imgur, по-видимому, недопустимо, я использовал отличный источник случайности: чат stackoverflow!
5 испытаний:
Не совсем случайно, но опять же, ни один из них не является.
источник
whatever.com/random
Perl
Я видел много ответов, которые делали HTTP-запросы, которые мне кажутся расточительными, потому что под крышками на проводе передаются случайные числа. Поэтому я решил написать какой-нибудь код для более низкого уровня:
Дает случайные порты в диапазоне 0,65535, теоретически. На практике есть несколько портов, которые вы никогда не увидите, поэтому распределение далеко от совершенства. Но это так, AFAICT минимальный объем работы, который вы можете сделать, чтобы получить некоторую энтропию от удаленного хоста, у которого открыт порт.
PS - Обработка ошибок оставлена читателю в качестве упражнения ;-)
источник
С
источник