![]() |
|
|
Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Senior Member
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,976
Вес репутации: 3723/81 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Здравствуйте.
меня интересует дешевая реализация генератора случайных чисел на базе pic32, у которого нет аппаратного RNG. кто как реализует? как мне лучше сделать? в целом я могу истратить ножку или 2 на rng, однако конечно хотелось бы обойтись внутренними ресурсами МК. смотрел статьи в интернетах - прохладная. |
![]() |
![]() |
![]() |
#2 | |
Senior Member
|
![]() Цитата:
Проводят несколько итераций, чего-то там считают... файл Helpers.c насколько это близко к истинно случайному - не берусь сказать.
__________________
|
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,976
Вес репутации: 3723/81 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
как мало помыслив я вижу.
random_init(void); random_get(); random_ctl(); ctl в свободное время наполняет пул неплохо сгенерированных с помощью аппаратного АЦП случайных числел. (просто по последнему биту набирает). random_get() излекает очередное неплохо сгенерированное, если числа есть в пуле, или если пул исчерпан, а числа снова нужны - псевдослучайное опираясь на последнем нормальном. |
![]() |
![]() |
![]() |
#4 | |
Senior Member
|
![]() Цитата:
По мне все таки у микрочип лучше реализовано
__________________
|
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,976
Вес репутации: 3723/81 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Vanizma
Шумы еще получить нужно... - да. у меня пробелы в знаниях. не могу с ходу понять, как мне лучше получить шум не выходя за пределы кристалла pic32, не затрачивая особой энергии и.т.д. я ознакомился с примерами microchip. странно все это выглядит. аппаратная долго генерирует и они позиционируют как только источник seed для псевдослучайных. |
![]() |
![]() |
![]() |
#6 |
Senior Member
|
![]()
Если интересует генератор псевдослучайных чисел, то вот так реализована rand() в С++. Это будет равномерно распределённая целочисленная величина. Из неё несложно получить вещественную, а затем и нормально распределённую. Главных недостатков два. Это псевдослучайность, конечный период последовательности, а также одинаковый её вид при каждом включении МК.
Первое в генераторе а-ля rand() побороть совсем нельзя, но можно улучшить. Чтобы побороть второе используют генерацию seed. Сам seed каждый раз не получают, потому что кто же его в точности знает, какое у него вообще распределение и являются ли последовательно сгенерированные seed независимыми. И ещё потому что долго. Вам из этого всего что конкретно нужно? |
![]() |
![]() |
![]() |
#7 |
Senior Member
Регистрация: 03.01.2009
Сообщений: 129
Вес репутации: 394/41 ![]() ![]() ![]() ![]() |
![]()
Я делаю генераторы случайных чисел на сдвиговых регистрах. Реализуются просто, работают быстро и можно сделать неповторяющуюся последовательность какой угодно длины.
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,463
Вес репутации: 4787/112 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
1. выборка шума с нужной характеристикой в памяти.
2 псевдослучайный генератор (белого шума) для индексации из выборки пункта 1. |
![]() |
![]() |
![]() |
#9 |
Senior Member
Регистрация: 03.01.2009
Сообщений: 129
Вес репутации: 394/41 ![]() ![]() ![]() ![]() |
![]()
Или так:
1. Запустить обычный счетчик, инкрементируемый с каждым шагом на 1. 2. Подвергнуть результат шифрованию каким-нибудь известным шифром. Результатом будет последовательность с хорошими статистическими характеристиками, так как надежная система шифрования устраняет какие-либо закономерности в исходных данных. |
![]() |
![]() |
![]() |
#10 |
Senior Member
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 1,976
Вес репутации: 3723/81 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
концепт простенького генератора на температурном диоде при старте, - потом псевдослучайный.
Код:
/** * get random seed * warning! blocking function * make random seed from ad conversion */ void random_init(void) { pic32mx_ctmu->con = _CTMUCON_ON_M | (0b11 << _CTMUCON_IRNG_P); pic32mx_adc0->con1 = _ADCON1_ON_M | (0x07 << _ADCON1_SSRC_P) | _ADCON1_CLRASAM_M; pic32mx_adc0->con2 = _ADCON2_CSCNA_M; pic32mx_adc0->con3 = _ADCON3_ADRC_M | (0x03 << _ADCON3_SAMC_P) | (0x07 << _ADCON3_ADCS_P); pic32mx_adc0->chs = (TEMPERATURE_ACHANNEL << _ADCHS_CH0SA_P); pic32mx_adc0->cssl = 1 << TEMPERATURE_ACHANNEL; /* use ADC for get chaos value */ chaos_value = 0; for(uf pos = 32; pos; --pos){ pic32mx_adc0->con1clr = _ADCON1_DONE_M; chaos_value <<= 1; pic32mx_adc0->con1set = _ADCON1_SAMP_M; while(!((pic32mx_adc0->con1) & _ADCON1_DONE_M)); chaos_value |= (pic32mx_adc0->buff[0].data)&0x01; } pic32mx_ctmu->conclr = _CTMUCON_ON_M; pic32mx_adc0->con1clr = _ADCON1_ON_M; } /** * get pseudo random value * @return pseudo random value */ __attribute__((leaf, noinline)) uint32_t random32(void) { chaos_value = (chaos_value & 0x01) ? (((chaos_value^0x80000057) >> 1) | 0x80000000) : (chaos_value >> 1); return chaos_value; } |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Регистрация: 23.08.2007
Адрес: Lipetsk
Возраст: 43
Сообщений: 220
Вес репутации: 425/48 ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
|
![]() Цитата:
http://bip-mip.com/generator-belogo-...uma-sxema.html
__________________
Если проблему можно решить за деньги, то это не проблема, это расходы. Еврейская мудрость. |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Регистрация: 23.08.2007
Адрес: Lipetsk
Возраст: 43
Сообщений: 220
Вес репутации: 425/48 ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#14 |
Senior Member
|
![]()
Там же есть наверное какой то встроенный низкочастотный таймер, типа wdt,ilo и тд?..Так просто в программе инкременируют некую переменную, а по прерыванию от того таймера снимают ее значение как случайное..Из за низкой точности таймера и многократного переполнения переменной значение будет случайным..
|
![]() |
![]() |
![]() |
Метки |
pic32 rng |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
PIC32 Starter Kit & внутрений генератор | gontharov | Продукция MICROCHIP | 16 | 04.06.2012 15:07 |
Генератор случайных чисел | PANYTA | Продукция MICROCHIP | 4 | 07.03.2012 11:18 |
Генератор случайных чисел для PIC16f84 | testament | Вопросы начинающих | 1 | 11.01.2010 10:22 |
Реверсирование генератора случайных чисел | IgorV | Общетехнические вопросы | 6 | 07.01.2009 11:15 |
Генератор псевдослучайных чисел | Vidocq | Вопросы начинающих | 6 | 28.09.2008 22:16 |