在文章<7jm48e$606$1@eskinews.eskimo.com> scs@eskimo.com "Steve Summit" 写道:
...
> 当N接近RAND_MAX时……
> 你唯一能做的就是多次调用rand(),
> 舍弃某些值
>
> [代码省略]
这和我之前发过的一些内容非常相似。
#include <stdlib.h> int randnum(int range) { int divisor = RAND_MAX / range; int threshold = RAND_MAX - RAND_MAX % range; int randval; while ((randval = rand()) >= threshold) ; return randval / divisor; }
理论上,这可能会无限循环。但是,每次迭代退出循环的几率总是大于0.5,而且通常更接近1。因此,经过相对较少的迭代后,循环继续下去的几率变得微乎其微(经过100次迭代后,几率可能远小于1/10^30)。然而,这确实假设rand()没有严重损坏,也就是说,它不会连续输出大量的大数字。但是,即使是较差的伪随机数生成器算法也不会那样做(这留下了一个真正有bug的实现)。
-- ----------------------------------------- Lawrence Kirby | fred@genesis.demon.co.uk Wilts, England | 70734.126@compuserve.com -----------------------------------------