随机数发生器

/*数据发生器*/

#include <stdio.h>

#include <stdlib.h>//rand()srand()需要

#include <time.h> //time()需要

int n = 100, m =100000;

double _rand_om (){//生成[0,1]之间的均匀随机数

    return (double)rand() /RAND_MAX;

}

int rand_om (int m){//生成[0,m-1]之间的均匀随机数

    return  (int)(_rand_om() * (m -1) + 0.5);

}

int main(int argc,char ** argv){

    srand(time(NULL));//初始化随机数种子

    printf("%d %d\n",n,m);

    for (int i =0; i < m; i++) {

        if (rand() %2 == 0) {

            printf("A");

        }else{

            printf("B");//随机指令种类

        }

        int X, Y;

        for (;;) {

            X = rand_om(n) +1;

            Y = rand_om(n) +1;

            if (X != Y) {

                break;//只有XY不相等才是合法的

            }

        }

        printf(" %d %d\n",X, Y);

    }

    return0;

}


 核心函数是stdlib.h中得rand(),它生成一个闭区间[0,RAND_MAX]的均匀随机整数(均匀的含义是:该区间内每个整数被产生的概率相同),其中,RAND_MAX至少为32767,如果要生成更大的随机数,在精度要求不太高的情况下可以用rand()的结果“放大”得到。严格的说,这里的随机数是伪随机数,因为它也是有数学公式计算出来的,不过在算法领域,多数情况下,可以把它当做真正的随机数。

很多人喜欢用rand()%n产生区间[0,n)内的一个随机数,先不讨论这样产生的整数是否仍然均匀分布,当n大于RAND_MAX时,此法并不能得到期望的结果。由于RAND_MAX很有可能只有32767这么小,在使用这个方法时应当小心。

上述代码采取的方法是先除以RAND_MAX,得到[0,1]之间的随机数,扩大n-1倍之后四舍五入,再加1得到[1,n]之间的均匀整数。这样做在n很大的时候“精度”不太好(好比将小图片放大之后会看到“锯齿”),但在这里的n很小,这样做已经可以满足要求了,若果坚持需要高精度,可以采取多次随机的方法。

程序最开始执行一次srand(time(NULL)),其中srand()函数用来初始化“随机数种子”。简单的说,种子是伪随机数计算的依据。种子相同,计算出来的“随机数”序列总是相同。如果不调用srand()函数而直接使用rand()函数,相当于调用过一次srand(1),因此程序每次执行时,将得到同一套随机数。另外,不要再同一个程序每次生成随机数之前都重新调用一次srand().有得初学者抱怨“rand()产生的随机数根本不随机,每次都相同”,就是因为误解了srand()的作用————再次强调,,只需要在程序的开始调用一次srand函数,而不要在同一个程序中多次调用。如果需要程序每次执行时使用一个不同的种子,可以用time.h中的time(NULL)为参数调用srand。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值