C语言产生随机数的方法

1、基本函数

  • 所需要包含的头文件:
#include <stdlib.h> 
  • 取随机数所需要的函数是:

int rand(void);

void srand(unsigned int n);


2、使用方法

(1) rand()函数会产生0至RAND_MAX(其值大于等于36767)之间的伪随机数(pseudorandom);  计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数
例如:

for(int i=0; i<10; i++)
{
printf("%d ", rand()%10); //产生0至9的随机数;
} 
                   编译运行,发现每次运行程序产生的随机数都是一样的; 计算机中产生随机数,实际是采用一个固定的数作为“种子”,在一个给定的复杂算法中计算结果,所以叫“伪随机数”。C语言中由于采用固定的序列作为"种子",所以每次运行所取的是同一个数。


(2) 为了产生不同的随机数列,需要srand函数来改变随机数“种子”。 srand()函数使用自变量n作为种子,用来初始化随机数产生器。只要把相同的种子传入srand(),然后调用rand()时,就会产生相同的随机数序列。因此,我们可以把 时间作为srand()函数的种子,就可以避免重复的发生。如果调用rand()之前没有先调用srand(),就会导致每次运行产生的结果一样。
例如:

srand((unsigned)time(NULL)); //调用time()函数前必须包含头文件time.h

for(int i=0; i<10; i++)
{
printf("%d ", rand()%10);
} 
          该程序每次运行结果都不一样,因为每次启动程序的时间都不同。



(3)产生一定区间内的随机数:

       (a,b)   (rand()%(b-a+1))+a-1               [a,b)   (rand()%(b-a))+a

       (a,b]   (rand()%(b-a))+a+1                  [a,b]   (rand()%(b-a+1))+a



(4)产生伪随机浮点数:
  • 要取得0~1之间的浮点数,可以用:
             rand() / (double)(RAND_MAX)
  • 如果想取更大范围的随机浮点数,比如0~100,可以采用如下方法:

            rand() /((double)(RAND_MAX)/100


例如:

srand(time(NULL));
printf("%lf\n",(double)rand()/RAND_MAX);



3、例子:

  • 程序示例

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main() {
//使用rand()函数产生伪随机数
printf("rand()函数产生的伪随机序列 :\n");
for (int i = 0; i < 10; i++) {
printf("%d ", rand());
}
//使用rand()函数产生0-20伪随机数
printf("\n\nrand()函数产生1-20的伪随机序列 :\n");
for (int i = 0; i < 10; i++) {
printf("%d ", rand()%20);
}
//使用rand()函数产生a-b的伪随机数a=3;b=42;(rand()%(b-a)+a)
printf("\n\nrand()函数产生3-42的伪随机序列 :\n");
for (int i = 0; i < 10; i++) {
printf("%d ", rand() % 39+3);
}
//关于浮点数可以使用RAND_MAX
//用时间作为种子,获得随机数
printf("\n\n获取真随机数:\n");
srand((unsigned)time(NULL));
for (int i = 0; i < 10; i++) {
printf("%d ", rand() % 10);
}
//采用时间作为种子是为了保证获得不同的随机序列
//我们会发现相同的种子可以获得相同的随机序列
printf("\n\n采用相同的种子获得相同的时间序列:\n");
printf("\n序列1的值:\n");
srand(1);
for (int i = 0; i < 10; i++) {
printf("%d ", rand() % 10);
}
printf("\n序列2的值:\n");
srand(1);
for (int i = 0; i < 10; i++) {
printf("%d ", rand() % 10);
}
printf("\n序列3的值:\n");
srand(1);
for (int i = 0; i < 10; i++) {
printf("%d ", rand() % 10);
}
return 0;
} 

  • 运行结果:



发布了1 篇原创文章 · 获赞 2 · 访问量 607
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览