C语言 伪随机数 指定范围随机数 学习

来源:互联网 发布:秋天的童话知乎 编辑:程序博客网 时间:2024/05/17 21:58

今天用到了C语言伪随机数进行测试,用完了顺便总结一下。


最基本,直接使用int rand(void)函数 它会为我们返回一个整形的数

#include <stdlib.h>

…………

int r = rand();

…………


然而当我们把上面程序改为:

…………

for(int i = 0;i<100;i++)

    printf("%d--%d/n",i,rand());

…………

我们会发现运行结果总为:

当然不同的机器可能有差别,但是你发现多次运行的结果都是一样的。这样的随机数某些时候是不够我们使用的。究其原因,我们不难在MSDN中找到答案。在生成随机数之前需要设置随机种子。系统提供了void srand( unsigned int seed)来完成该设置。默认情况下seed = 1;该函数设置随机数的起始位置。进而我们将代码改动为:

…………

srand(2);//默认为1 故设置为2区别

for(int i = 0;i<100;i++)

    printf("%d--%d/n",i,rand());

…………

这次的运行结果为

当然,我们会发现运行结果总上面的。

经过多次改动我发现,srand()每设置一个值对等的就有一组固定的随机数。反过来一想若是每次srand()每次设置的是一个未知的随机的数,那产生的随机数组也自然也就是一个比较切合实际的随机。所以将成代码改为:

…………

srand( (unsigned)time( NULL ) );//系统时间

for(int i = 0;i<100;i++)

    printf("%d--%d/n",i,rand());

…………

这样产生的随机数,多次运行也不会出现前面那样的相同序列了。

但是不管之前的哪个代码,最好不要将设置随机数的起始位置放到了for循环中,那样你会得到一个很糟糕的随机数或者根本就不是随机数了。

 

以下介绍几种产生需要范围的随机数。

1.产生范围low到high之间的随机数(以下low<high)

…………

srand( (unsigned)time( NULL ) );//系统时间

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

    if (r>low&&r<high)

         printf("%d--%d/n",i,rand());

    else

        i++;

}

…………

2.若low = 0又可以将代码改为:

…………

srand( (unsigned)time( NULL ) );//系统时间

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

 

        printf("%d--%d/n",i,rand()%(high+1));//包括high

}

…………

3.若low = 0&&high = 1,即0-1的小数,又可以将代码改为:

…………

srand( (unsigned)time( NULL ) );//系统时间

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

 

        printf("%d--%f/n",i,rand()/((double)RAND_MAX));//包括high,返回为double类型也可用float存储

}

…………

4.有了上面代码,又可以产生0-high之间的浮点数

…………

srand( (unsigned)time( NULL ) );//系统时间

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

 

        printf("%d--%f/n",i,high*((rand()/((double)RAND_MAX))));//包括high,返回为double类型也可用float存储

}

…………

5.最后再简单介绍一个产生负数的:

产生low-0之间的浮点数

…………

srand( (unsigned)time( NULL ) );//系统时间

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

 

        printf("%d--%f/n",i,low*((rand()/((double)RAND_MAX))));//包括high,返回为double类型也可用float存储

}

…………

其余情况只需将上面的代码进行适当的变形即可得到想要的随机数。


参考文献:http://baike.baidu.com/view/1127.htm

 

初识微学忘各位指点。