Для моего проекта я использовал карту Henon для генерации (псевдо)-случайного числа. Я использовал следующий код для генерации матрицы (псевдо)-случайного числа.
def generate_by_henonmap (размер, ключ):
х = ключ [0]
у = ключ [1]
# Общее количество произведенных битовых последовательностей
sequenceSize = измерение * измерение * 8
bitSequence = [] # Каждая bitSequence содержит 8 бит
byteArray = [] # Каждый byteArray содержит m bitSequence
Matrix = [] # Каждая матрица содержит m*n byteArray
для i в диапазоне (sequenceSize):
# Классическая карта Энона имеет значения a = 1,4 и b = 0,3.
хН = у + 1 - 1,4 * х**2
уН = 0,3 * х
х = хН
у = уН
если xN <= 0,4:
бит = 0
еще:
бит = 1
пытаться:
bitSequence.append(бит)
кроме:
битовая последовательность = [бит]
если я % 8 == 7:
десятичное = десятичное (последовательность битов)
пытаться:
byteArray.append(десятичный)
кроме:
массив байтов = [десятичный]
битовая последовательность = []
byteArraySize = измерение * 8
если я % byteArraySize == byteArraySize-1:
пытаться:
Matrix.append(массив байтов)
кроме:
Матрица = [массив байтов]
массив байтов = []
матрица возврата
Прежде чем использовать этот код в своем производстве, я проверяю случайность с помощью набора тестов NIST из это но получил такой результат:
Допустимый тест из NIST-SP800-22r1a:
-монобит
-частота_в_блоке
-бежит
-самая длинная_выполнить_единицы_в_блоке
-dft
-non_overlapping_template_matching
-серийный
-приблизительная_энтропия
-нарастающие суммы
-random_excursion
-random_excursion_variant
Результаты теста:
- ПРОШЕЛ - оценка: 0,525 - Монобит - прошедшее время: 0 мс
- ПРОШЕЛ - оценка: 0,999 - Частота внутри блока - прошедшее время: 0 мс
- FAILED - оценка: 0.0 - Runs - прошедшее время: 1 мс
- FAILED - оценка: 0,002 - Самое длинное выполнение в блоке - прошедшее время: 0 мс
- FAILED - оценка: 0,004 - Дискретное преобразование Фурье - истекшее время: 2 мс
- ПРОШЕЛ - оценка: 0,899 - Сопоставление неперекрывающихся шаблонов - истекшее время: 8 мс
- FAILED - оценка: 0.0 - Serial - прошедшее время: 54 мс
- FAILED - оценка: 0.0 - Приблизительная энтропия - прошедшее время: 102 мс
- ПРОШЕЛ - оценка: 0,887 - Суммарные суммы - прошедшее время: 4 мс
- FAILED - оценка: 0,11 - Случайное отклонение - прошедшее время: 28 мс
- ПРОШЕЛ - оценка: 0,678 - Случайный вариант экскурсии - прошедшее время: 1 мс
Я думал, что хаотическая карта может генерировать достаточно рандома, но результат был таким разочаровывающим. Есть ли какая-либо логическая ошибка в коде, которая приводит к такому плохому результату? Я предполагаю, что то, как он генерирует битовую последовательность числа, создает проблему.
если xN <= 0,4:
бит = 0
еще:
бит = 1
Есть ли лучшая реализация хаотической карты для создания (псевдо)-случайного числа?