常用的几个函数

来源:互联网 发布:淘宝付了定金怎么退 编辑:程序博客网 时间:2024/04/27 21:47

    随机数的产生

    大多数情况下使用函数 srand() 和 rand() 即可搞定,这两个函数包含于头文件 <cstdlib> 中。为了取得可变的随机码,必须在使用rand()前调用srand()函数来取得随机种子,这样编译后的程序才在每次运行时可以产生不同的随机数。

例子:

srand( ( unsigned ) time( NULL ) ) ;

一般取系统时间为种子,time() 函数包含于头文件<ctime>中,注意添加。需要注意的一点是time()函数取的时间最小间隔为1s,也可以用clock()函数,它的时间间隔为1ms。

rand();

可以取到的随机整数范围是0到RAND_MAX,RAND_MAX在都文件中用宏定义的,一般为28

rand()%100;

表示取0到99间的随机整数。但此方法并不是很好,取出的各个数并非等概率。更好的方法是在RAND_MAX

中设置几个等长段,这样随机数调入段中概率才是均等的。

// return a random integer in the range `[0,' `n)'

int nrand(int n)
{
    if (n <= 0 || n > RAND_MAX)
        throw domain_error("Argument to nrand is out of range");

    const int bucket_size = RAND_MAX / n;
    int r;

    do r = rand() / bucket_size;
    while (r >= n);

    return r;
}

下面附一个:

 

求区间[0,n)你可能认为rand()%n就足够了,但在实际中这个技巧会因为两个原因而导致失败。

1、rand()函数真正返回的是伪随机数。在除数是小整数时,很多c++系统的伪随机数生成器生成的余数并不是非常随机

化的。比如,rand()函数产生的连续结果常常会交替出现奇数和偶数。如果是那样的话,如果n=2,rand()%n的连续结

果就将交替出现0和1。

2、如果n的值很大,并且RAND_MAX不可被n整除的话,一些余数就会过于频繁的出现。比如,假定RAND_MAX是

32767,n是20 000。在这种情况下,rand()函数就会有两种截然不同的值,它们会使得rand()%n成为10 000(也就是

rand()为10 000和30 000),但是rand()只有一个值能使rand()%n成为15 000(也就是rand()为15 000)。因此,运行rand%n

的天真系统在对rand()%20 000时,生成10 000的次数会是生成15 000的次数的两倍。

原创粉丝点击