C语言如何生成随机数?

把C语言的随机数做了一个整理:

在计算机中并没有一个真正的随机数发生器,但是可以做到使产生的数字重复率很低,这样看起来好象是真正的随机数,实现这一

功能的程序叫伪随机数发生器。
使用rand()和srand()函数。这二个函数的工作过程如下:
1.首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
2.然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
3.根据需要多次调用rand(),从而不间断地得到新的随机数;
4.无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
如果提供相同的种子值,那么,将会得到相同的随机数序列。

解释:系统在调用rand()之前都会自动调用srand(),如果用户在rand()之前曾调用过srand()给参数seed指定了一个值,那么 rand(
就会将seed的值作为产生伪随机数的初始值;而如果用户在调用rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始值

,即srand(1)。


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
srand((unsigned int)time(0或NULL));
rand();//注意这样生成的随机数在0到32767之间

生成一定范围的随机数:

方法一:
1.rand()%50,得到一个0到49之间的值
2.然后将该值加1,得到1到50之间的值。
3.即要产生[a,b]的随机数,公式:(rand()%b)+a

方法二:
要取得[a,b)之间的随机整数,公式:(rand() % (b-a))+ a(注意!!!结果将含a不含b)。
在a为0的情况下,简写为rand() % b。

方法三:
模除加加法的方式。
要产生随机数r, 其范围为 [a,b],可以使用如下公式:rand()%(n-m+1)+m
其原理为,对于任意数,
0<=rand()%(n-m+1)<=n-m,
于是0+m<=rand()%(n-m+1)+m<=n-m+m
即m<=rand()%(n-m+1)+m<=n

注意:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
    int i;

    for(i=0;i<10000;i++)
    {
srand((unsigned int)time(NULL));
printf("%hd\n",rand());
    }
    return 0;
}

这段代码会出现一个奇怪的运行结果:大家自己运行一下。

解答:这个程序每产生一个随机数之前,都调用一次srand,而由于计算机运行很快,所以每次用time得到的时间都是一样的( time的时

间精度较低,只有55ms)。这样相当于使用同一个种子产生随机序列,所以产生的随机数总是相同的。应把srand放在循环外


#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
    int i;
    srand((unsigned int)time(NULL));
    for(i=0;i<10000;i++)
    {
printf("%hd\n",rand());
    }
    return 0;
}

经测试,代码正常。

思考如何才能生成大于32767的随机数那?

疑问目前的思路是把两个随机数相加。。。两个范围0--32767的加起来就是0-65534的随机数.。。。但是还没有实现。。。大家有好的思路或者文章有错误可以联系我啊微笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值