概述
"随机数"在C语言程序设计中也会经常遇到,利用随机数生成函数我们可以获取许多位的随机数、随机数组、随机矩阵等等。
是不是充满了吸引力~
下面就介绍如何使用:
生成随机数要使用到三个函数:
- rand():
rand()函数用来产生随机数,会在0~32767的范围内随机返回一个整型数;
使用该函数之前需要引用库函数 "stdlib.h";
其函数原型为:int rand(void),参数为空,返回值为一个int型变量。
使用rand()函数来产生随机数实际上并不是严格意义上的随机数,它是通过一个算法来模拟输出随机数,因为算法周期比较长,所以基本就达到了"随机",但是如果仅仅使用该函数,那么每次运行输出的结果都是一样的:#include <stdio.h> #include <stdlib.h> int main() { int i; system("title 伪随机数示例程序1"); printf("Random numbers are: %i %in",rand(),rand()); printf("Random numbers are: %i %in",rand(),rand()); printf("Random numbers are: %i %in",rand(),rand()); return 1; }
#include <stdio.h> #include <stdlib.h> int main() { int i; system("title 伪随机数示例程序2"); printf("Random numbers are: %i %in",rand(),rand()); printf("Random numbers are: %i %in",rand(),rand()); printf("Random numbers are: %i %in",rand(),rand()); return 1; }
运行两个程序后会发现两次输出的结果是一致的,那么如何实现更好的"随机"呢?这个时候我们就会用到下一个函数。
-
srand():
srand()函数是随机数发生器的初始化函数。
函数原型:void srand(unsigned int seed);,参数是一个整型变量(随机数种子);
srand()需要与rand()配合使用,rand()在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的,就像上面的两个程序一样,已确定默认种子的值,而srand()函数就起到手动改变种子的作用。
但是我们会发现:如果在两个程序中种子设置的是相同的,那么rand()返回的值还是相同的。
那么有什么办法可以让每次传入的种子都不一样呢(手动一个一个输入除外)?
那么我们首先就会想到什么东西是在一直变化的呢?——时间;
如果将当前的系统时间提取出来再传入srand函数中,不就可以实现每次种子都不一样了么,Bingo!
这就需要使用time()函数: -
time():
time() 是返回自 Unix 纪元(1970.01.01 00:00:00)起的当前时间的秒数的函数,主要用来获取当前的系统时间,返回的结果是一个 time_t(我在另一篇博客中有提到)类型。
使用方法:time(0);
结合srand使用方法:srand(time(0)); 这就实现了获取不同的随机种子。
rand()函数的一些用法:
- rand()%10:rand()函数返回的值对10取余,就可获取0~9的数;
- i+rand()%(j-i-1) :获取范围在 [i , j]的随机数;
随机数获取示例——获取四位随机数:
- 提到这个问题的解决方案我们可能会想到使用上面第一种用法:rand()%10000;
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i,count=0;
srand(time(0));
system("title 获取四位的随机数");
for(i=0;i<30;i++)
{
printf("%-6d",rand()%10000);
count++;
if(count%5==0)
{
printf("n");
}
}
return 1;
}
- 但是观察运行结果(为什么出错了呢?回到文章开头的rand()函数介绍看看第一句吧~~):
- 那么应该怎么样实现呢?(既然获取多位数有问题,那么我就一位一位获取然后把他们拼起来不就可以了嘛~Bingo!)
这就需要我么使用数组来保存获取的每一位随机数,然后再将其赋值给一个整型数值,就可以得到一个四位的随机数了。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 4
int main()
{
int i,a=0;
int m=1000;
int num[4];
system("title 随机数");
srand(time(0));
for(i=0;i<4;i++)
{
num[i]=rand()%10;
}
for(i=0;i<N;i++)
{
printf("%d",num[i]);
}
for(i=0;i<N;i++)
{
a+=num[i]*m;
m=m/10;
}
return 0;
}
-
如果有小伙伴是自己敲的,那么可能会写成以下这种形式:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 4
int main()
{
int i,a=0;
int m=1000;
int num[4];
system("title 随机数");
for(i=0;i<4;i++)
{
srand(time(0));
num[i]=rand()%10;
}
for(i=0;i<N;i++)
{
printf("%d",num[i]);
}
for(i=0;i<N;i++)
{
a+=num[i]*m;
m=m/10;
}
return 0;
}
什么?你说没看到差别?好吧好吧~那就再多看几遍就吧~~(结合运行结果能不能实际地体会到计算机的运算速度呢?)
-
但是我们又会想到:如果我们想要获取十位不相同的随机数,该怎么办呢?添加重复检测即可:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
int main()
{
int res;
int num[N];
srand(time(0));
for(int i=0;i<N;i++)
{
num[i]=rand()%10;
/*重复检测*/
int k=0;
while(k<i){
if(num[k] == num[i]){
num[i] = rand()%10;
k = 0;
continue;
}else{
k++;
if(k == N){
break;
}
}
}
}
for(int i=0;i<N;i++){
printf("%d",num[i]);
}
return 0;
}
最快的脚步不是跨越,而是继续,最慢的步伐不是小步,而是徘徊。
最后
以上就是合适蜜蜂为你收集整理的C Programming - 随机数生成的全部内容,希望文章能够帮你解决C Programming - 随机数生成所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复