C语言随机数的生成【详解】
C语言随机数的生成【详解】
目录
-
一、rand 函数 和 srand 函数
在C语言中比较常用的随机函数是 rand 函数,它可以随机的产生 0 ~ rand_max 的随机数,定义类型不同最大值也不同,rand 函数包含在头文件stdlib.h中。
#include <stdio.h> #include <stdlib.h> int main() {<!-- --> int a=rand(); printf("%d",a); return 0; }
运行结果………………………………………… 你会发现每次产生的随机数都是相同的,因为rand 函数产生的随机数是伪随机数,是根据一个数按照某个公式推算出来的,这个数我们称之为“种子”,但是这个种子在系统启动之后就是一个定值。
要想每次产生的随机数不一样,那么,我们就要用到 srand 函数。
srand() 函数原型是:
void srand (usigned int seed);
rand() 产生随机数时,如果用srand(seed) 播下种子之后,一旦种子相同,产生的随机数将是相同的。当然很多时候刻意让rand() 产生的随机数随机化,用时间作种子 srand(time(NULL)) ,这样每次运行程序的时间肯定是不相同的,产生的随机数肯定就不一样了。 此段原文链接: https://blog.csdn.net/lvyibin890/article/details/80141412.如果想看rand和srand函数详解,可观看此文。
通常可以利用 time(0) 或 getpid(0) 作为seed的返回值,下面我们只介绍用time(0)实现随机数。
srand((unsigned)time(NULL)); //用时间作种子
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() {<!-- --> srand((unsigned)time(NULL)); int n=rand(); printf("%d\n",n); return 0; }
此时我们就可以随机产生一个数了。
二、生成范围随机数公式
但,作题时我们往往不会用到上面这种方式去产生一个随机数,而是希望产生一定范围内的数据。
1
产生随机数范围:[0,9]int a=rand()%10; //注意10会被整除,所以不包括10
2
产生随机数范围:[0,99]int a=rand()%100;
3
产生随机数范围:[66,88]int a=66+rand()%23;
结论
产生随机数范围:[m,n]int a=m+rand()%(n-m+1);
接下来举几个例子:
注意:下面的程序会将 srand((unsigned)time(NULL)) 换成 srand(time(0)),用srand(time(0))方便,且一样可以满足以上产生范围随机数的各种情况。
三、随机数实例:选择排序等
① 随机产生10个[150,270)范围内随机数
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() {<!-- --> int a[11]; int i; printf("随机产生10个[150,270)范围内随机数:\n\n"); srand(time(0)); //srand(time(NULL)); for(i=1;i<=10;i++) //一般键盘随机输入10个数方式:scanf("%d",&a[i]); a[i]=150+rand()%120; for(i=1;i<=10;i++) printf("%d ",a[i]); printf("\n"); return 0; }
运行结果………………………………………… ② 随机产生10个[0,99)范围内随机数(`指针`)
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() {<!-- --> int a[10]; int *p; printf("随机产生10个[0,99)范围内随机数:\n\n"); srand(time(0)); //srand(time(NULL)); for(p=a;p<(a+10);p++) *p=rand()%100; for(p=a;p<(a+10);p++) printf("%d ",*p); //使用指针指向当前的数组元素 printf("\n"); return 0; }
运行结果………………………………………… ③ 地址 — 随机数
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() {<!-- --> int a[10]; int i; printf("产生10个[0,99]随机数:\n\n"); srand(time(0)); //srand(time(NULL)); for(i=0;i<10;i++) {<!-- --> a[i]=rand()%100; //随机函数产生 [0,100) printf("%d ",a[i]); } printf("\n\n"); printf(" 地址 --- 随机数\n\n"); for(i=0;i<10;i++) printf(" %d --- %d\n",a+i,*(a+i)); //通过原数组名和元素序号计算地址 printf("\n"); return 0; }
运行结果…………………………………………
④ 实例:选择排序
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() {<!-- --> int a[10]; int i,t,j,min; srand(time(0)); printf("随机产生10个[0,99]随机数:\n"); for(i=0;i<10;i++) a[i]=rand()%100; //产生10随机数 for(i=0;i<10;i++) printf("%d ",a[i]); //输出随机数 printf("\n\n"); for(i=0;i<=9;i++) {<!-- --> min=i; for(j=i+1;j<10;j++) if(a[min]>a[j]) min=j; if(i!=min) {<!-- --> t=a[i]; a[i]=a[min]; a[min]=t; } } printf("由小到大排序:\n"); for(i=0;i<10;i++) printf("%d ",a[i]); return 0; }
运行结果…………………………………………