"Новый нейронный" - проект Open Source движка нейронной сети для платформы MetaTrader 5. - страница 44

 
Urain:

Класс ГПСЧ в указанном диапазоне.

Преимущества: возможность иметь несколько рандомов с разной инициализацией,

равномерно-распределённые значения любого диапазона в плоть до 10 лямов(к сожалению больше нельзя массива не хватит).

На 10 лямов вызовов Rand() обогнал стандартный rand на 50 мкс (time rnd.Rand()=344 time rand()=391).

Недостатки: инициализируется долго Srand(), стандартный диапазон 32768 (766 мкс), 1 лям почти 2 минуты.

Предел в 10 лямов не проверял но наверняка неимоверно долго так как время растёт в прогрессии. 


Принимается здоровая критика.



Можно подробнее?

Для каких целей могут понадобиться эти функции? 

   uint              control(){return(gcnt-1);};// получить значение счётчика при последнем автоматическом запросе Rand

   uint              Rand(uint i){return(res[i]);};// запрос Rand по указанному i (счётчик не изменяется)

 

Или маленький примерчик использования.

Чем стандартный не устраивает? 

 
her.human:

Можно подробнее?

Для каких целей могут понадобиться эти функции? 

   uint              control(){return(gcnt-1);};// получить значение счётчика при последнем автоматическом запросе Rand

   uint              Rand(uint i){return(res[i]);};// запрос Rand по указанному i (счётчик не изменяется)

 

Или маленький примерчик использования.

Чем стандартный не устраивает? 

Эти функции могут понадобится для того чтоб просто скопирповать часть или полностью рандомную последовательность или получить значения которые были выданы на определённых вызовах Rand().

Стандпртный не устраивает многим:

1) Если нужно получить последовательность от 0 до 100 равномерно-распределённую, то напрямую со стандартного вы не получите(придётся лепить алгоритм).

2) Не возможно использовать две последовательности одновременно, инициализация srand, делает невозможным использование предыдущей инициализации.

3) Диапазон стандартного rand позволяет сделать разбиение только на 32768 частей и никак иначе. Я уже не говорю чтоб сделать разбиение на 100000, но даже на любой кратный 10 диапазон не разбить. Например: у вас есть диапазон [-1;1], и вам нужно его разбить на шаг с точностью до 3-го знака, инициализируем класс на диапазон 2000, далее

Rand()/1000.-1.

и получаем ГПСЧ из диапазона [-1;1] с шагом 0.001

Стандартным такого не сделать.

 
Кто? что? скажет, может можно ещё как то оптимизнуть задачу?
 
Urain:

Эти функции могут понадобится для того чтоб просто скопирповать часть или полностью рандомную последовательность или получить значения которые были выданы на определённых вызовах Rand().

Стандпртный не устраивает многим:

1) Если нужно получить последовательность от 0 до 100 равномерно-распределённую, то напрямую со стандартного вы не получите(придётся лепить алгоритм).

2) Не возможно использовать две последовательности одновременно, инициализация srand, делает невозможным использование предыдущей инициализации.

3) Диапазон стандартного rand позволяет сделать разбиение только на 32768 частей и никак иначе. Я уже не говорю чтоб сделать разбиение на 100000, но даже на любой кратный 10 диапазон не разбить. Например: у вас есть диапазон [-1;1], и вам нужно его разбить на шаг с точностью до 3-го знака, инициализируем класс на диапазон 2000, далее

и получаем ГПСЧ из диапазона [-1;1] с шагом 0.001

Стандартным такого не сделать.

1) Согласен.

2) Непонятно? Для каких целей может это понадобиться?

3) Сильно в код не вникал, похоже это относится к 1).

Поэтому и возник вопрос по этим (выше) двум функциям.

Такой класс (функция) безусловно нужен. Но лишние тормоза никому не нужны. 

 

Если возникают трудности с пониманием пп 2, может сначало нужно определиться зачем вообще нужен ГПСЧ ?

Тогда станет понятно зачем иметь одновременно две некоррелируемые последовательности ГПСЧ.

 
Urain:

Если возникают трудности с пониманием пп 2, может сначало нужно определиться зачем вообще нужен ГПСЧ ?

Тогда станет понятно зачем иметь одновременно две некоррелируемые последовательности ГПСЧ.


Странно слышать - некоррелируемые последовательности ГПСЧ. 

Не могу понять, для чего это нейросети? 

 
her.human:

Не могу понять, для чего это нейросети? 

Да так, просто модная штука сейчас...

Urain:

Преимущества: возможность иметь несколько рандомов с разной инициализацией,

Т.е. каждый объект велет свою последовательность?

Недостатки: инициализируется долго Srand(), стандартный диапазон 32768 (766 мкс), 1 лям почти 2 минуты.

Вот здесь оооочень страшно, нереально. Не должно быть такого.

Посмотрю когда хоть чуть чуть просветы будут.
 
her.human:

Странно слышать - некоррелируемые последовательности ГПСЧ. 

Не могу понять, для чего это нейросети? 

Напомню если кто забыл, после 32768 вызовов rand (если не делать переинициализацию) последовательность повторяется на то она и гПсч.

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

Алгоритмы у сетей есть разные, например Монтекарло, или ГА, опять же каждая сеть с любым алгоритмом требует начальные значения весов.

 
TheXpert:

Да так, просто модная штука сейчас...

1) Т.е. каждый объект велет свою последовательность?

2) Вот здесь оооочень страшно, нереально. Не должно быть такого.

Посмотрю когда хоть чуть чуть просветы будут.

1 Да каждый объект запоминает последовательность при Srand(), дальше выдаёт её по кругу прям как стандартный rand().

2 Это я уже оптимизнул как мог, было хуже.

В кратце, чтоб проще разгребать было опишу чё там закодил:

после подготовки, пишим во временный массив возрастающую последовательность (значения счётчика), дальше генератором выдаёт значение из дипапазона renge(этот индекс и запрашивается при присвоении из temp  в res), как только выдали значение в результирующий буфер, во временный на это место ставим renge (значение которое генератор не может выдать). Значения выдаём буферу res через проверку, если в temp попался renge значит такое значение мы уже присвоили в res, тогда делаем быструю сортировку(которая сгоняет все renge в конец массива) и урезаем диапазон на оставшуюся нетронутую последовательность. Дальше продолжаем пока не заполним весь res.

 
Urain:

Напомню если кто забыл, после 32768 вызовов rand (если не делать переинициализацию) последовательность повторяется на то она и гПсч.

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

Алгоритмы у сетей есть разные, например Монтекарло, или ГА, опять же каждая сеть с любым алгоритмом требует начальные значения весов.

Это всё предположения. Доказательств нет.

Много экспериментировал с ГА, было такое сомнение , что ГПСЧ зацикливается (повторяется). Оказалось - дело было не в бобине ... (это про меня).

Итог: ГПСЧ никак не влияет на работу ГА.

 

Про инициализацию: 

Есть такое желание, чтобы можно было инициализировать на выбор - нулями, ГПСЧ, из файла

Причина обращения: