Как получить случайное число в N-ном деапазоне ? - страница 6

 
Aleksey Vyazmikin #:

Мне для маркета надо - там нельзя dll использовать. Ну и не умею я на другом языке то ваять, увы.

а софт (который эксперты, индикаторы и прочие монте-карлы) крайне чувствительны ко всем качествам ГСЧ. Если не касаться оптимизаций и тестирования, то и фик с ним. 

НО лёгким движением руки, простой перевёртыш (Buy/Sell в случайную сторону с фикс лот/тп/сл)  добавляет профитность. Просто мизерным изменением распределения MathRand()

 
Maxim Kuznetsov #:

а софт (который эксперты, индикаторы и прочие монте-карлы) крайне чувствительны ко всем качествам ГСЧ. Если не касаться оптимизаций и тестирования, то и фик с ним. 

НО лёгким движением руки, простой перевёртыш (Buy/Sell в случайную сторону с фикс лот/тп/сл)  добавляет профитность. Просто мизерным изменением распределения MathRand()

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

Мне нужны просто комбинации настроек, которые уже отобраны - настроек много - все не перебрать, поэтому в начале отобрал по отдельности по несколько десятков для каждого фильтра, потом фильтры рандомятся как и настройки.

В общем мне помогли, подсказали про MathSrand(GetTickCount()); - так получается значительно лучше.

 
Aleksey Vyazmikin #:

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

Мне нужны просто комбинации настроек, которые уже отобраны - настроек много - все не перебрать, поэтому в начале отобрал по отдельности по несколько десятков для каждого фильтра, потом фильтры рандомятся как и настройки.

В общем мне помогли, подсказали про MathSrand(GetTickCount()); - так получается значительно лучше.

это смотря что, как, и зачем потом ты с ним делаешь. Вообще привычный MathRand() годен только для генерации идентификаторов.

в качестве источника энтропии для (не к ночи упомянуто) нейронок - вообще не подходит

 
Aleksey Vyazmikin #:

Подыму ветку, ибо вижу тут умных людей.

Ситуация такая, нужно мне при инициализации рандомить настройки - выяснилось, что комбинации очень сильно повторяются, т.е. допустим мне нужно получить случайное значение от 0 до 99, при этом получаю 6 раз его, и из 1000 случаев в 11 я имею одинаковую комбинацию выпадания последовательно этих 6 значений - как сделать реальный рандом при инициализации? Может как то привязаться к локальным часам или ещё как? Использовал разные тут предложенные функции (нужна без dll).

Визуализация повторений


Прикладываю код советника, который при оптимизации выдает значение случайных генераторов.

Не может быть такого.
Ищите семантическую ошибку 
 

Хы, идея возникла. Берём текущую котировку на любом торговом инструменте. Из неё извлекаем последние 2 цифры после запятой. Превращаем их в целое число. Это можно сделать через операции со строками - сначала дубль в строку, затем в другую переменную 2 последние цифры, затем строку в инт. Получим случайное двухразрядное число. Поскольку очередной тик в произвольный момент времени непредсказуем, получаем идеальный генератор случайных чисел, правда, в диапазоне от 00 до 99. К полученному числу прибавляем 1 и получаем практически идеальный генератор случайных чисел в диапазоне от 1 до 100. Как вам идея?

Правда, на вялом рынке может работать плоховато.

P.S.

Если случайное число = предыдущему случайному числу, то берём котировку с другого торгового инструмента. И так цикл. Должно сработать идеально.

 
Vitaly Murlenko #:

Хы, идея возникла. Берём текущую котировку на любом торговом инструменте. Из неё извлекаем последние 2 цифры после запятой. Превращаем их в целое число. Это можно сделать через операции со строками - сначала дубль в строку, затем в другую переменную 2 последние цифры, затем строку в инт. Получим случайное двухразрядное число. Поскольку очередной тик в произвольный момент времени непредсказуем, получаем идеальный генератор случайных чисел, правда, в диапазоне от 00 до 99. К полученному числу прибавляем 1 и получаем практически идеальный генератор случайных чисел в диапазоне от 1 до 100. Как вам идея?

Правда, на вялом рынке может работать плоховато.

P.S.

Если случайное число = предыдущему случайному числу, то берём котировку с другого торгового инструмента. И так цикл. Должно сработать идеально.

получаем вариант Бинарных Опционов (есть там такая лотерейка ЧЁТ/НЕЧЁТ), при чём там круче - там один-два последних знака  котировки :-) 

к ним имеем известный "парадокс выборов" и ни разу не равномерное распределение

 
Тут наверно следует спросить топикстартера. Что-то мне подсказывает, что случайное число ему нужно не на каждом тике. Если это так, то ему не шибко то и нужно, чтоб распределение было равномерным.
 

что за функцией  ranвlong вы пользуетесь? Какое то горе от ума.

ulong RandomLong(ulong range)
{
 #define _MAXRND(range, rnd_range)  ((rnd_range) - ((rnd_range)-range)%range - 1) 
 #define _RND (ulong)rand()
  ulong rnd, max, const bit=1;
  if (range <= bit<<15) { if (!range) return 0;  max=_MAXRND(range, 1<<15);  while((rnd=_RND) > max);  return rnd%range; }
  if (range <= bit<<30) { max=_MAXRND(range, bit<<30);  while((rnd=(_RND | _RND<<15)) > max);  return rnd%range; }
  if (range <= bit<<45) { max=_MAXRND(range, bit<<45);  while((rnd=(_RND | _RND<<15 | _RND<<30)) > max);  return rnd%range;  }
  if (range <= bit<<60) { max=_MAXRND(range, bit<<60);  while((rnd=(_RND | _RND<<15 | _RND<<30 | _RND<<45)) > max);  return rnd%range; }
                  else  { max=_MAXRND(range, bit<<64);  while((rnd=(_RND | _RND<<15 | _RND<<30 | _RND<<45 | _RND<<60)) > max);  return rnd%range; }
 #undef _RND               
 #undef _MAXRND
}


это будет попроще, правильнее и побыстрее.

ulong randUlong(ulong max=ULONG_MAX){return(((ulong)rand()<<60)|((ulong)rand()<<45)|((ulong)rand()<<30)|((ulong)rand()<<15)|(ulong)rand())%max;}
но случайный long - это явный перебор.
Вполне достаточно использовать :
uint randUint(uint max) {return(((uint)rand()<<15)|(uint)rand())%max;}
в этой функции будет генерироваться случайное число от 0 до 1073741824
 
здесь уже подробно обсуждалось эта тематика с замерами производительности. Кому интересно - можете почитать с этого момента.
 
О да! Неистовая битва за производительность в ините... )))
Причина обращения: