Случайное число - страница 2

 
lynxntech #:

Огромное спасибо.

 
Volodymyr Zubov #:

Огромное спасибо.

Это код от Integer

void OnStart()
{
  while(!IsStopped()) {
    Comment((string)rndr(1,55)); 
    Sleep(1000); 
  }
}


//+------------------------------------------------------------------+
int rndr(int mn,int mx,bool inclusive=true) {
   return(mn+rndn(mx-mn+(int)inclusive));
}
int rndn(int n) {
   if(n>32768 || n<0) return(-1);
   int r;
   while((r=MathRand())<32768%n);
   return(r%n);
}
 
Vitaly Muzichenko #:

Это код от Integer

return(-1);

:-)

за такое в хорошим коллективе лишают кофе .. в смысле что на такие грабли надо ещё умудриться наступить, но если наступишь то такую ошибку фик лоцируешь - провоцирование OOB

 
Maxim Kuznetsov #:

:-)

за такое в хорошим коллективе лишают кофе .. в смысле что на такие грабли надо ещё умудриться наступить, но если наступишь то такую ошибку фик лоцируешь - провоцирование OOB

Критика - это хорошо.

Код работает изумительно, за почти 3 года ни одного вылета -1

:)

 
вихрь мерсена вещь !!!
 

считаю оптимальным такой вариант:

uint rnd(uint max) {return(((uint)rand()<<15)|(uint)rand())%max;}

возвращает до 2^30  = 1 073 741 824
стало быть при max = 1 000 000 вероятность аномалии не более 0.1%. При меньшем max аномалия еще меньше. Так при max = 32768, аномалия ~ 0.003%
работает чуть быстрее чем вариант rndn(примерно на 20%), предложенный выше, несмотря на то что диапазон значительно выше.

ЗЫ Впрочем при малых диапазонах (например 1000) rndn будет быстрее.

 
Nikolai Semko #:

считаю оптимальным такой вариант:

возвращает до 2^30  = 1 073 741 824
стало быть при max = 1 000 000 вероятность аномалии не более 0.1%. При меньшем max аномалия еще меньше. Так при max = 32768, аномалия ~ 0.003%
работает чуть быстрее чем вариант rndn(примерно на 20%), предложенный выше, несмотря на то что диапазон значительно выше.

ЗЫ Впрочем при малых диапазонах (например 1000) rndn будет быстрее.

Да, если объединить оба варианта, то получится максимально оптимальное решение по производительности и защиты от аномалий

uint rnd(uint max) {
   if(max>1073741823) return(-1);
   if(max<=16384) {
      uint r;
      while((r=MathRand())<32768%max);
      return(r%max);
   } else return (((uint)rand()<<15)|(uint)rand())%max;
}
 
Nikolai Semko #:

Да, если объединить оба варианта, то получится максимально оптимальное решение по производительности и защиты от аномалий

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

 
Nikolai Semko #:

Да, если объединить оба варианта, то получится максимально оптимальное решение по производительности и защиты от аномалий

rnd(10993) как контрпример :-) с вероятностью больше 1/3  внутренний цикл будет повторяться

 
lynxntech #:

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

Перфекционизм батенька, перфекционизм...

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