我试图生成兰特随机数如下:帮助我建立这个随机数
return a + (rand() % n);
其中a是漂移值(即连续整数的所需范围的第一个数字)并且n是比例因子(即,连续整数的期望范围的宽度)。
- Ç如何第六版计划 - Deitel公司
我把它写成:
return 1 + (rand() % 1000);
和它的作品,但是当我写的代码如下:
return 1000 + (rand() % 1112);
我最终得到了荒谬的大数字,例如1756和1877.那是发生的最后两个输出。
我返回值作为一个整数的printf语句中的函数调用,但我做同样与工作发言,所以我不认为这我调用函数的方式。
我在做什么错了......?
使用'兰特()%x'几乎总是略微向范围中的较低的数字偏压(因为如果'(RAND_MAX + 1)'是不x'的'的精确倍数,有更多的值,其中'兰特()%x == 0'比'rand()%x == x - 1')。为了保持一致性,你应该丢弃rand()大于或等于((RAND_MAX + 1)/ x)* x'的任何值,每次从rand()获得一个新值大。如果你不关心不一致性,这种改进是不必要的;只要知道你正在做的近似。 – 2013-04-06 01:04:14
@JonathanLeffler更妙的是,根本就没有使用'rand'和用户一个适当的PRNG) – 2013-04-06 01:54:55