Перейти к содержанию
    

Генератор случайных чисел на STM32

1 минуту назад, mplata сказал:

Важно чтобы в течение максимального периода не было повторений.

Ну вот и оцени сколько у тебя за этот период будет случайных выборок, потом раздели это на 3 с 38 нулями и получишь вероятность повтора. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, artemkad сказал:

Ну вот и оцени сколько у тебя за этот период будет случайных выборок, потом раздели это на 3 с 38 нулями и получишь вероятность повтора. 

Есть два варианта: ноль и всё остальное. 😉 В данном случае будет не ноль, хотя и очень малое число, но не ноль.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 5/8/2024 at 10:33 AM, mplata said:

Есть необходимость генерации последовательности случайных чисел в диапазоне 2^128.
Ключевое требование нет повторений, и нет элементарных чисел типа 00000....001 и т.п.

Вроде бы, прямое (Декартово) произведение двух полей Галуа: \(GF(2^{63}) \times GF(2^{65})\) имеет период: \((2^{63}-1)\cdot(2^{65}-1)\approx2^{128}\).
Для вычисления нужно найти примитивные полиномы в обоих полях и сделать конкатенацию обоих LFSR.
IMHO..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, makc сказал:

Есть два варианта: ноль и всё остальное.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, artemkad сказал:

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

Если ТС нужен GUID/UUID, то как раз наоборот хорошо.

1 час назад, artemkad сказал:

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

Согласен, но про ключи у ТС речи не шло.

В любом случае решать ТС, т.к. мы не знаем сути прикладной задачи, которую он пытается решить с помощью этого механизма.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как сделать псевдослучайный генератор, чтобы зная его алгоритм и наблюдая значения на выходе нельзя было за разумное время предсказать следующее значение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, makc сказал:

Ваш, @jcxz, вариант на АЦП, к сожалению, не отвечает этому требованию.

Почему?

3 часа назад, makc сказал:

В предлагаемом вами варианте нет никаких гарантий отсутствия повторений, т.к. если основным источником шума в АЦП будет помеха от работы какого-либо узла платы или от самого МК,

Причём тут "помеха от работы какого-либо узла платы"? Речь шла об использовании например теплового шума какого-либо элемента (резистора, диода или схемы на их основе). Достаточно чтобы непредсказуемо шумел хотя бы один младший бит в данных АЦП. Впрочем - и штатные (уже имеющиеся) измерения каких-то напряжений через АЦП тоже подойдут - ведь в них наверняка тоже есть хотя бы один шумящий разряд. Дальше - накапливаем этих данных как можно больше и считаем от них CRC или хеш нужной длины (равной требуемому размеру случайного числа). Всё.

2 часа назад, artemkad сказал:

Для 2^128 вероятность повтора примерно равномерно распределенного случайного события в обозримой истории ничтожно мала. По сути там работает закон больших чисел.

У ГПСЧ проблема не в повторе какого-то числа, а в том что при одном и том же стартовом seed, последовательность будет одна и та же. Если это не проблема в задаче ТС, то можно его использовать.

2 часа назад, mplata сказал:

Тем не менее. Важно чтобы в течение максимального периода не было повторений. Важно именно максимально увеличить период без повторений. 

Если вам подойдёт псевдослучайное, то можно попробовать "Вихрь Мерсенна": https://ru.wikipedia.org/wiki/Вихрь_Мерсенна

Это вроде как очень хороший алгоритм ГПСЧ.

Есть его си++ исходники (вроде как): https://www.boost.org/doc/libs/1_49_0/boost/random/mersenne_twister.hpp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, jcxz сказал:

Причём тут "помеха от работы какого-либо узла платы"? Речь шла об использовании например теплового шума какого-либо элемента (резистора, диода или схемы на их основе).

При том, что АЦП будет регистрировать суперпозицию шумов и нужно гарантировать, что правильный шум (имеющий равномерное или подобное ему распределение) будет доминировать. В противном случае получится регистратор наводок от какого-нибудь ШИМ DC/DC.

2 минуты назад, jcxz сказал:

Впрочем - и штатные (уже имеющиеся) измерения каких-то напряжений через АЦП тоже подойдут - ведь в них наверняка тоже есть хотя бы один шумящий разряд. 

Случайность и независимость этого шума от процессов в системе вы можете обосновать? Я - нет. Посмотрите, как люди бьются с генерацией случайных чисел на кольцевых генераторах... Казалось бы всё просто, но это совсем не так как кажется. 😞

4 минуты назад, jcxz сказал:

Дальше - накапливаем этих данных как можно больше и считаем от них CRC или хеш нужной длины (равной требуемому размеру случайного числа). Всё.

Это не добавляет энтропии в получаемое случайное число, но выравнивает распределение случайных величин. Т.е. в сумме это всё равно будет не качественное случайное число. А, главное, есть вероятность его повторения, которой по словам ТС быть не должно в принципе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jcxz сказал:

У ГПСЧ проблема не в повторе какого-то числа

У ГСПЧ такой проблемы нет - там числа точно никогда за период не повторяются. Если именно это стало причиной выбора ГСПЧ вместо истинного случайного числа я и указал, что это зря, потому как при столь крупных числах генератор СЧ с равномерным законом распределения, в разумные сроки и так числа не повторяет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В принципе период повторяемости минимум через 10^8 генераций с учетом начального числа в виде серийного номера будет супер результатом! Но если это будет через 1000 генераций это провал конечно.

Quote

У ГПСЧ проблема не в повторе какого-то числа, а в том что при одном и том же стартовом seed, последовательность будет одна и та же. Если это не проблема в задаче ТС, то можно его использовать.

однозначно стартовое число будет разным, но! как гарантировать, что при начальном числе 000000001 и 00000002 последовательности не будут содержать одинаковых значений на периоде 10^8 генераций. Чтобы они не пересекались. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, mplata сказал:

В принципе период повторяемости минимум через 10^8 генераций с учетом начального числа в виде серийного номера будет супер результатом! Но если это будет через 1000 генераций это провал конечно.

У Вихря Мерсенна период намного больше = 4,3•106001

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 5/8/2024 at 6:49 PM, jcxz said:

У Вихря Мерсенна период намного больше = 4,3•106001

А где хранить серийный номер размером 2,5 килобайт? Стикер клеить на корпус? 😉

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, mplata сказал:

последовательности не будут содержать одинаковых значений на периоде 10^8 генераций.

хранить результат предыдущих 10^8 генераций, искать в них совпадение и перегенерировать если нашли. очевидно же)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 5/9/2024 at 3:20 AM, tgruzd said:

хранить результат предыдущих 10^8 генераций, искать в них совпадение и перегенерировать если нашли.

Не обязательно..
Можно дополнить N-битное случайное число N-битным порядковым номером этого числа.
Это удвоит число разрядов в полученном случайном числе, но зато гарантирует отсутствие совпадений в полученных случайных числах.
И, НЯМС, увеличение числа разрядов допустимо, так как в условиях задачи про ограничение числа разрядов в получаемых случайных числах ничего не сказано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...