Получение случайных элементов с помощью php
Содержание:
- Генерация случайных буквенно-цифровых строк в PHP
- Игра в кости с использованием модуля random в Python
- Использование случайных чисел
- Z1FFER
- Лава-лампы в Cloudflare
- HotBits
- Выбор случайного элемента из списка choice() модуль random
- Квантовые флуктуации вакуума
- Функция rand().
- Usage
- Истинная случайность
- Зачем нужны функции getstate() и setstate() ?
- Генератор квантовых случайных чисел из смартфона
Генерация случайных буквенно-цифровых строк в PHP
Существует множество способов генерации случайных буквенно-цифровых строк, и то, что вы используете, будет зависеть от ваших потребностей.
Создание перетасованных строк
Если вы хотите генерировать случайные буквенно-цифровые строки из фиксированного набора символов, вы можете использовать функцию . Эта функция предоставит вам случайную перетасованную строку. Начиная с PHP 7.1, алгоритм, который определяет случайный порядок символов в выходной строке, был изменен на Mersenne Twister.
Помните, что случайная строка, сгенерированная таким образом, не является криптографически безопасной. Тем не менее, строка по-прежнему будет довольно непредсказуемой для общего использования, например, для генерации случайных имен файлов или URL-адресов. Вот несколько примеров:
В обоих случаях ваш результат, скорее всего, будет разным. В первом случае мы просто перетасовали допустимую строку символов, а затем взяли первые 10 символов. Во втором случае мы добавили «video» в начале сгенерированной строки и «.mp4» в конце.
Этот способ генерации случайных буквенно-цифровых строк очень прост, но у него есть несколько проблем. Например, вы никогда не получите одинаковые символы в своей случайной строке дважды. Кроме того, длина строки случайного вывода может достигать только длины входной строки.
Создание случайных строк
Если проблемы, перечисленные выше, являются неприемлемыми, вы можете посмотреть на некоторые другие реализации. Следующий код поможет решить эти проблемы.
Вы можете изменить его, чтобы добавить определенные суффиксы и префиксы к сгенерированной случайной строке. Люди, которые используют PHP 7, могут улучшить генерацию строк дальше, используя криптографически защищенную функцию вместо .
Создание случайных шестнадцатеричных строк
Если вы хотите генерировать случайные шестнадцатеричные строки в PHP, вы также можете использовать либо , либо функцию . Обе они будут генерировать хэши входной строки.
Вы будете получать уникальные хэши, пока вход уникален. Этого можно добиться, используя результат функции, такой как в качестве входного параметра. По умолчанию вернет шестнадцатеричную строку с 32 символами, а вернет 40-значную шестнадцатеричную строку. Их можно обрезать до определенной длины, используя функцию .
Ниже приведен пример вывода, возвращаемого этими функциями:
Как вы можете видеть, генерация случайных и уникальных шестнадцатеричных строк длиной до 40 символов очень проста в PHP.
Генерация криптографически безопасных случайных строк
Три функции генерации случайных буквенно-цифровых строк, которые мы обсуждали до сих пор, не являются криптографически безопасными. К счастью, PHP также имеет функцию для генерации криптографически защищенных псевдослучайных байтов. Параметр определяет длительность строки вывода.
Как только вы получите выход в виде случайных байтов, вы можете использовать функцию , чтобы преобразовать их в шестнадцатеричные значения. Это удвоит длину строки.
Другая функция, которую вы можете использовать для генерации криптографически безопасных случайных байтов, — . Значение второго параметра можно использовать для определения того, будет ли генерироваться строка вывода с использованием криптографически безопасного алгоритма или нет.
Игра в кости с использованием модуля random в Python
Далее представлен код простой игры в кости, которая поможет понять принцип работы функций модуля random. В игре два участника и два кубика.
- Участники по очереди бросают кубики, предварительно встряхнув их;
- Алгоритм высчитывает сумму значений кубиков каждого участника и добавляет полученный результат на доску с результатами;
- Участник, у которого в результате большее количество очков, выигрывает.
Код программы для игры в кости Python:
Python
import random
PlayerOne = «Анна»
PlayerTwo = «Алекс»
AnnaScore = 0
AlexScore = 0
# У каждого кубика шесть возможных значений
diceOne =
diceTwo =
def playDiceGame():
«»»Оба участника, Анна и Алекс, бросают кубик, используя метод shuffle»»»
for i in range(5):
#оба кубика встряхиваются 5 раз
random.shuffle(diceOne)
random.shuffle(diceTwo)
firstNumber = random.choice(diceOne) # использование метода choice для выбора случайного значения
SecondNumber = random.choice(diceTwo)
return firstNumber + SecondNumber
print(«Игра в кости использует модуль random\n»)
#Давайте сыграем в кости три раза
for i in range(3):
# определим, кто будет бросать кости первым
AlexTossNumber = random.randint(1, 100) # генерация случайного числа от 1 до 100, включая 100
AnnaTossNumber = random.randrange(1, 101, 1) # генерация случайного числа от 1 до 100, не включая 101
if( AlexTossNumber > AnnaTossNumber):
print(«Алекс выиграл жеребьевку.»)
AlexScore = playDiceGame()
AnnaScore = playDiceGame()
else:
print(«Анна выиграла жеребьевку.»)
AnnaScore = playDiceGame()
AlexScore = playDiceGame()
if(AlexScore > AnnaScore):
print («Алекс выиграл игру в кости. Финальный счет Алекса:», AlexScore, «Финальный счет Анны:», AnnaScore, «\n»)
else:
print(«Анна выиграла игру в кости. Финальный счет Анны:», AnnaScore, «Финальный счет Алекса:», AlexScore, «\n»)
1 |
importrandom PlayerOne=»Анна» PlayerTwo=»Алекс» AnnaScore= AlexScore= diceOne=1,2,3,4,5,6 diceTwo=1,2,3,4,5,6 defplayDiceGame() «»»Оба участника, Анна и Алекс, бросают кубик, используя метод shuffle»»» foriinrange(5) #оба кубика встряхиваются 5 раз random.shuffle(diceOne) random.shuffle(diceTwo) firstNumber=random.choice(diceOne)# использование метода choice для выбора случайного значения SecondNumber=random.choice(diceTwo) returnfirstNumber+SecondNumber print(«Игра в кости использует модуль random\n») foriinrange(3) # определим, кто будет бросать кости первым AlexTossNumber=random.randint(1,100)# генерация случайного числа от 1 до 100, включая 100 AnnaTossNumber=random.randrange(1,101,1)# генерация случайного числа от 1 до 100, не включая 101 if(AlexTossNumber>AnnaTossNumber) print(«Алекс выиграл жеребьевку.») AlexScore=playDiceGame() AnnaScore=playDiceGame() else print(«Анна выиграла жеребьевку.») AnnaScore=playDiceGame() AlexScore=playDiceGame() if(AlexScore>AnnaScore) print(«Алекс выиграл игру в кости. Финальный счет Алекса:»,AlexScore,»Финальный счет Анны:»,AnnaScore,»\n») else print(«Анна выиграла игру в кости. Финальный счет Анны:»,AnnaScore,»Финальный счет Алекса:»,AlexScore,»\n») |
Вывод:
Shell
Игра в кости использует модуль random
Анна выиграла жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 5 Финальный счет Алекса: 2
Анна выиграла жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 10 Финальный счет Алекса: 2
Алекс выиграл жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 10 Финальный счет Алекса: 8
1 |
Игравкостииспользуетмодульrandom Аннавыигралаигрувкости.ФинальныйсчетАнны5ФинальныйсчетАлекса2 Аннавыигралаигрувкости.ФинальныйсчетАнны10ФинальныйсчетАлекса2 Аннавыигралаигрувкости.ФинальныйсчетАнны10ФинальныйсчетАлекса8 |
Вот и все. Оставить комментарии можете в секции ниже.
Использование случайных чисел
В PHP случайные числа играют огромную роль, т.к. очень часто используются для различных целей. В основном, они связаны с безопасностью. На их основе генерируются токены CSRF, ключи API, значения для аутентификации, значения для сброса паролей и многое другое. Всё это делается, для того чтобы получаемые значение было невозможно предугадать.
Самые важные примеры применения случайных значений:
- Генерация соли для криптографии — случайное число соли используется, как правило, для шифрования “в одну сторону”, а также для хэширования паролей. Это случайное значение используется как вектор инициализации в криптографии.
- Генерация случайных значений, таких как ID сессии — PHP используется для создания огромного количества приложений, где безопасность стоит на первом месте. Многий функционал базируется на работе с сессиями и сгенерированными ID сессий.
- Генерация токенов для аутентификации, которые практически невозможно предугадать — многие PHP приложения базируются на работе с другими системами через специальные API интерфейсы. Обычно перед использованием API нужно пройти процесс аутентификации. Получать трудно-подбираемые значения для токенов очень сложно. Именно поэтому в данных задачах используются случайные числа.
Z1FFER
Еще один недорогой генератор случайных чисел с открытым исходным кодом, который придется по душе всем любителям DIY. Каждый может собрать и разобрать устройство, а также удостовериться, что в нем нет встроенных бэкдоров.
Z1FFER не является законченным продуктом и не поставляется с каким-либо ПО (авторы делятся лишь несколькими сценариями и инструкцией для начала работы). Он предназначен для работы на платформе arduino, однако не имеет подтвержденной надежности от взлома извне. Устройство в первую очередь для тех, кто хочет лично «пощупать» технологию генерации чисел с помощью железа.
Z1FFER использует тепловой шум от резистора, удваивая сигнал, что приводит к экспоненциальному росту сложности предсказания последовательности бит.
Лава-лампы в Cloudflare
Компания CloudFlare, которая сама заявляет, что через ее сеть проходит «около 10 % мирового трафика», защищает интернет-проекты от DDoS-атак, но и ей самой нужна защита. Трафик, который проходит через сети CloudFlare, шифруется — и в этом помогает сотня разноцветных лава-ламп на «Стене Энтропии».
Лавовая лампа представляет собой стеклянную емкость, заполненную прозрачным маслом и полупрозрачным парафином. Расположенная в нижней части емкости лампочка накаливания нагревает и подсвечивает содержимое цилиндра, при этом происходит «лавообразное» перемещение парафина в масле. Парафин немного тяжелее масла, но при небольшом нагреве становится легче и всплывает.
За движением жидкостей наблюдают несколько камер, делающих моментальные фотоснимки. Снимки преобразовываются в числа, из которых потом генерируются ключи шифрования. За один кадр получается 16 384 бит энтропии.
В двух других офисах CloudFlare используются иные способы получать случайные значения. В Лондоне камера снимает движения трех хаотических маятников, а в Сингапуре поставили счетчик Гейгера, замеряющий показатели радиоактивного распада небольшого кусочка урана. В последнем случае уран используется в качестве «источника данных», поскольку для радиоактивного излучения характерна случайность каждого отдельного акта распада.
Все эти способы работы с данными привлекают внимание к деятельности компании, чья работа часто остается невидимой для обычных клиентов
HotBits
HotBits — сайт, который предоставляет всем желающим истинные случайные числа, генерируемые с помощью счетчика Гейгера, регистрирующего ионизирующее излучение. Вы заполняете на сайте форму запроса с указанием количества случайных байт и выбираете предпочтительный способ получения данных. Предварительная заявка необходима, поскольку аппаратное обеспечение HotBits позволяет создавать данные со скромной скоростью около 100 байт в секунду.
После того, как случайные числа предоставляются клиенту, они немедленно удаляются из системы — одни и те же данные никогда не будут отправлены разным пользователям (если, конечно, вы доверяете HotBits).
Для получения еще большей надежности данных существует ресурс EntropyPool, который собирает и «миксует» случайные биты из разных источников, включая HotBits и random.org (этот ресурс, в свою очередь, «добывает» энтропию атмосферного радиошума). Люди, которые переживают за квантовую безопасность в максимальной степени, к вышеназванным ресурсам могут добавить онлайн-сервис Quantum Random Bit Generator.
Выбор случайного элемента из списка choice() модуль random
Метод используется для выбора случайного элемента из списка. Набор может быть представлен в виде списка или python строки. Метод возвращает один случайный элемент последовательности.
Пример использования в Python:
Python
import random
list =
print(«random.choice используется для выбора случайного элемента из списка — «, random.choice(list))
1 |
importrandom list=55,66,77,88,99 print(«random.choice используется для выбора случайного элемента из списка — «,random.choice(list)) |
Вывод:
Shell
random.choice используется для выбора случайного элемента из списка — 55
1 | random.choiceиспользуетсядлявыбораслучайногоэлементаизсписка-55 |
Квантовые флуктуации вакуума
Схематическое представление пространственно-временных отклонений от уровня невозмущенных вакуумных флуктуаций электрического поляИсточник
Вакуум, вопреки названию («vacuus» — пустой), истинно пустым считать нельзя, поскольку в нем в силу принципа неопределенности Гейзенберга беспрестанно рождаются и умирают виртуальные частицы — происходят так называемые квантовые флуктуации, колебания уровня энергии в единице объема пространства-времени.
Канадские физики сконструировали быстрый и конструктивно простой генератор случайных чисел на базе вакуумных флуктуаций. Генератор состоит из импульсного лазера с высокой частотой излучения, среды с высоким коэффициентом преломления (алмаз) и детектора. Проходя через алмаз, каждый импульс на детекторе показывает разные характеристики, в зависимости от вакуумных флуктуаций поля, которые встретились на пути фотонов. В спектре рассеянного излучения на выходе появляются спектральные линии, которых нет в спектре первичного света, а из-за непредсказуемости вакуумных флуктуаций эти линии каждый раз отличаются непредсказуемым образом.
Физики говорят, что не существует даже концепции того, как теоретически можно было бы разработать устройство для предсказаний колебаний энергии появления и аннигиляции виртуальных частиц — это одно из самых случайных событий, которое мы наблюдаем во Вселенной.
Осталось сделать этот генератор достаточно компактным и дешевым, чтобы начать его массовое использование.
Функция rand().
Данная функция возвращает случайное целое число в диапазоне от нуля до RAND_MAX. RAND_MAX это специальная константа языка Си, в которой содержится максимальное целое число, которое может быть возвращено функцией rand().
Функция rand() определена в заголовочном файле stdlib.h. Поэтому, если хотите использовать rand в своей программе, не забудьте подключить этот заголовочный файл. Константа RAND_MAX тоже определена в этом файле. Вы можете найти этот файл у себя на компьютере и посмотреть её значение.
Давайте посмотрим на эту функцию в действии. Запустим следующий код:
Листинг 1.
#include <stdio.h> // чтобы пользоваться функцией printf #include <stdlib.h> // чтобы пользоваться функцией rand int main(void) { /* генерируем пять случайных целых чисел */ printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); }
Должно получиться что-то вроде этого.
Рис.1 Пять случайных чисел, сгенерированных функцийе rand
Но нам бы хотелось получить числа от 1 до 53, а не всё подряд. Ниже описано несколько трюков, позволяющих наложить ограничения на функцию rand().
Ограничить случайные числа сверху.
Кто в школе ждал момента, когда ему пригодится математика, приготовьтесь. Этот момент наступил.
Чтобы ограничить сверху случайные числа, можно воспользоваться операцией получения остатка от деления, которую вы изучили в прошлом уроке.
Наверное вы знаете, что остаток от деления на числа K всегда меньше числа K. Например, при делении на 4 могут получиться остатки 0, 1, 2 и 3. Поэтому если вы хотите ограничить сверху случайные числа числом K, то просто возьмите остаток от деления на K. Вот так:
Листинг 2.
#include <stdio.h> #include <stdlib.h> int main(void) { /* генерируем пять случайных целых чисел меньших 100 */ printf("%d\n", rand()%100); printf("%d\n", rand()%100); printf("%d\n", rand()%100); printf("%d\n", rand()%100); printf("%d\n", rand()%100); }
Рис.2 Пять случайных чисел меньше 100
Ограничить числа снизу.
Функция rand возвращает случайные числа из отрезка . А что если нам нужны только числа большие числа M (например, 1000)? Как быть? Всё просто. Просто прибавим к тому, что вернула функция rand, наше значение M. Тогда если функция вернёт , итоговый ответ будет M, если 2394, то итоговый ответ будет M + 2394. Этим действием мы как бы сдвигаем все числа на M единиц вперёд.
Задать границы функции rand сверху и снизу.
Например, получить числа от 80 до 100. Кажется, нужно просто объединить два способа, которые приведены выше.
Получим что-то вроде этого:
Листинг 3.
#include <stdio.h> #include <stdlib.h> int main(void) { /* генерируем пять случайных целых чисел больших 80 и меньших 100 */ printf("%d\n", 80 + rand()%100); printf("%d\n", 80 + rand()%100); printf("%d\n", 80 + rand()%100); printf("%d\n", 80 + rand()%100); printf("%d\n", 80 + rand()%100); }
Попробуйте запустить эту программу. Удивлены?
Да, такой способ работать не будет. Давайте прокрутим эту программу руками, чтобы убедиться в том, что мы допустили ошибку. Допустим rand() вернула число 143. Остаток от деления на 100 равен 43. Дальше 80 + 43 = 123. Значит такой способ не работает. Подобная конструкция выдаст числа от 80 до 179.
Давайте разберём по действиям наше выражение.
rand()%100 может выдать числа от до 99 включительно. Т.е. из отрезка .
Операция + 80 сдвигает наш отрезок на 80 единиц вправо. Получаем .
Как видим, проблема у нас заключается в правой границе отрезка, она сдвинута вправо на 79 единиц. Это наше исходное число 80 минус 1. Давайте наведём порядок и сдвинем правую границу назад: 80 + rand()%(100 — 80 + 1). Тогда всё должно сработать как надо.
В общем случае если нам нужно получить числа из отрезка , то необходимо воспользоваться следующей конструкцией:A + rand()%(B-A+1).
Согласно этой формуле перепишем нашу последнюю программу:
Листинг 4.
#include <stdio.h> #include <stdlib.h> int main(void) { /* генерируем пять случайных целых чисел из отрезка */ printf("%d\n", 80 + rand()%(100 - 80 + 1)); printf("%d\n", 80 + rand()%(100 - 79)); printf("%d\n", 80 + rand()%21); printf("%d\n", 80 + rand()%21); printf("%d\n", 80 + rand()%21); }
Результат работы:
Рис.3 Случайные числа из диапазона
Ну вот, теперь вы можете решить исходную задачу урока. Сгенерировать число из отрезка .
Или не можете?
Но прежде ещё немного полезной информации. Запустите последнюю программу три раза подряд и записывайте себе случайные числа, которые она генерирует. Заметили?
Usage
Generate a string of random bytes
try { $string = random_bytes(32); } catch (TypeError $e) { // Well, it's an integer, so this IS unexpected. die("An unexpected error has occurred"); } catch (Error $e) { // This is also unexpected because 32 is a reasonable integer. die("An unexpected error has occurred"); } catch (Exception $e) { // If you get this message, the CSPRNG failed hard. die("Could not generate a random string. Is our OS secure?"); } var_dump(bin2hex($string)); // string(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f"
Generate a random integer between two given integers (inclusive)
try { $int = random_int(, 255); } catch (TypeError $e) { // Well, it's an integer, so this IS unexpected. die("An unexpected error has occurred"); } catch (Error $e) { // This is also unexpected because 0 and 255 are both reasonable integers. die("An unexpected error has occurred"); } catch (Exception $e) { // If you get this message, the CSPRNG failed hard. die("Could not generate a random int. Is our OS secure?"); } var_dump($int); // int(47)
Exception handling
When handling exceptions and errors you must account for differences between
PHP 5 and PHP7.
The differences:
- Catching works, so long as it is caught before .
- Catching has different behavior, without previously catching .
- There is no portable way to catch all errors/exceptions.
Example
try { return random_int(1, $userInput); } catch (TypeError $e) { // This is okay, so long as `Error` is caught before `Exception`. throw new Exception('Please enter a number!'); } catch (Error $e) { // This is required, if you do not need to do anything just rethrow. throw $e; } catch (Exception $e) { // This is optional and maybe omitted if you do not want to handle errors // during generation. throw new InternalServerErrorException( 'Oops, our server is bust and cannot generate any random data.', 500, $e ); }
Troubleshooting
Exception: «Could not gather sufficient random data»
If an Exception is thrown, then your operating system is not secure.
- If you’re on Windows, make sure you enable mcrypt.
- If you’re on any other OS, make sure is readable.
- FreeBSD jails need to expose from the host OS
- If you use , make sure is allowed
This library does not (and will not accept any patches to) fall back to
an insecure random number generator.
Version Conflict with
If you’re using a project that has a line like this in its composer.json
…and then you try to add random_compat 2 (or another library that explicitly
requires random_compat 2, such as this secure PHP encryption library),
you will get a version conflict.
The solution is to get the project to update its requirement string to allow
version 2 and above to be used instead of hard-locking users to version 1.
"require" { ... - "paragonie/random_compat": "~1.1", + "paragonie/random_compat": ">=1", ... }
Version 9.99.99
Note: There is a special version called which makes this
library do nothing, but is only installable on PHP 7.
If you’re writing software (e.g. a library) that supports PHP 5, but may
be used by software that doesn’t, you’ll want to allow to be
installed. The above diff is what you want.
Conversely, if you’re writing software that (in and of itself) supports
PHP 5, you do not want 9.99.99 to be installed, so you’ll want to make
this change instead:
"require" { ... - "paragonie/random_compat": "~1.1", + "paragonie/random_compat": ">=1 <9.99", ... }
To avoid installing «empty» version you can add section
in your root :
Manifest Read Length Error
If you’re using the PHP Archive (Phar) approach rather than Composer, and
you are getting an error message to the effect of «manifest read length
was should be «, the Phar extension may not be enabled.
See
for specific guidance on how to fix this issue.
Истинная случайность
Имея так много источников данных, логично задаться вопросом: а как в действительности проверить случайность бит?
Национальный институт стандартов и технологий США предложил «Пакет статистических тестов для случайных и псевдослучайных генераторов чисел для криптографических приложений». В его состав входят 15 статистических тестов, целью которых является определение меры случайности бит, порожденных либо аппаратными, либо программными генераторами.
Одни из самых строгих статистических тестов предложил профессор Джордж Марсалья из Университета штата Флорида. «Тесты diehard» включают 17 различных проверок, некоторые из них требуют очень длинных последовательностей: минимум 268 мегабайт.
Случайность можно проверить с помощью библиотеки TestU01, представленной Пьером Л`Экуйе и Ричардом Симардом из Монреальского университета, включающей классические тесты и некоторые оригинальные, а также посредством общедоступной библиотеки SPRNG.
Еще один полезный сервис для количественного измерения случайности — http://www.fourmilab.ch/random.
И не будем забывать про самый главный критерий — каждый следующий бит в последовательности случайных данных должен быть предсказан с вероятностью, не превышающей вероятность встретить динозавра на улице 😉
Зачем нужны функции getstate() и setstate() ?
Если вы получили предыдущее состояние и восстановили его, тогда вы сможете оперировать одними и теми же случайными данными раз за разом. Помните, что использовать другую функцию random в данном случае нельзя. Также нельзя изменить значения заданных параметров. Сделав это, вы измените значение состояния .
Для закрепления понимания принципов работы и в генераторе случайных данных Python рассмотрим следующий пример:
Python
import random
number_list =
print(«Первая выборка «, random.sample(number_list,k=5))
# хранит текущее состояние в объекте state
state = random.getstate()
print(«Вторая выборка «, random.sample(number_list,k=5))
# Восстанавливает состояние state, используя setstate
random.setstate(state)
#Теперь будет выведен тот же список второй выборки
print(«Третья выборка «, random.sample(number_list,k=5))
# Восстанавливает текущее состояние state
random.setstate(state)
# Вновь будет выведен тот же список второй выборки
print(«Четвертая выборка «, random.sample(number_list,k=5))
1 |
importrandom number_list=3,6,9,12,15,18,21,24,27,30 print(«Первая выборка «,random.sample(number_list,k=5)) state=random.getstate() print(«Вторая выборка «,random.sample(number_list,k=5)) random.setstate(state) print(«Третья выборка «,random.sample(number_list,k=5)) random.setstate(state) print(«Четвертая выборка «,random.sample(number_list,k=5)) |
Вывод:
Shell
Первая выборка
Вторая выборка
Третья выборка
Четвертая выборка
1 |
Перваявыборка18,15,30,9,6 Втораявыборка27,15,12,9,6 Третьявыборка27,15,12,9,6 Четвертаявыборка27,15,12,9,6 |
Как можно заметить в результате вывода — мы получили одинаковые наборы данных. Это произошло из-за сброса генератора случайных данных.
Генератор квантовых случайных чисел из смартфона
В 2014 году Женевский университет отметился устройством QRNG, которое использует восьмимегапиксельную камеру смартфона Nokia N9.
Камера смартфона подсчитывает количество фотонов, попадающих на каждый отдельный пиксель. Источником света выступает обычный светодиод. Работа камеры и светодиода регулируется так, чтобы каждый пиксель в 8 МП камере обнаруживал около 400 фотонов за короткое время. Число фотонов на всех пикселях преобразуется в последовательность случайных чисел со скоростью 1,25 Гбит/сек.
Такая скорость — не рекорд. Еще в 2011 году Intel показал, что их процессорный генератор создает поток случайных чисел со скоростью около 3 Гбит/сек. Однако все компоненты QRNG могут быть интегрированы на чипе стоимостью в несколько долларов и легко добавлены в любые портативные электронные устройства, включая смартфоны.