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

 
Maxim Kuznetsov #:

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

опытным путем получил, но да, похоже ошибся. 
Вместо 16384 нужно ставить 8192

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

опытным путем получил, но да, похоже ошибся. 
Вместо 16384 нужно ставить 8192

тут плохой вариант 6557 :-)

32768%6557 = 6540

вероятность что MathRandom() выкинет от 0 до 6540 = 19.96% , с вероятностью почти 1/5 внутренний цикл будет повторяться

PS/ а вообще нечего мозг взрывать рандомом (про rand() можно очень долго беседовать) , надо брать библиотеки и их использовать 

к примеру вот https://www.gnu.org/software/gsl/doc/html/rng.html#c.gsl_rng_uniform_int

Random Number Generation — GSL 2.7 documentation
  • www.gnu.org
The library provides a large collection of random number generators which can be accessed through a uniform interface. Environment variables allow you to select different generators and seeds at runtime, so that you can easily switch between generators without needing to recompile your program. Each instance of a generator keeps track of its...
Причина обращения: