发件人:Lawrence Kirby
新闻组:comp.lang.c
主题:回复:为什么我的随机数不随机?
日期:1999年6月9日,星期三,01:38:49 GMT
消息ID:<928892329snz@genesis.demon.co.uk>

在文章<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
-----------------------------------------