如何生成一个随机数
文件包含#include<stdlib.h>
1.前言:
1.在实际编程中,我们经常需要生成随机数。在c语言中我们通常使用rand方法生成随机数,在调用rand前需要调用srand初始化随机数种子。
本文介绍如何正确的使用rand函数生成随机数。
2.使用rand函数:
使用rand函数生成随机数,rand随机生成一个位于 0 ~ RAND_MAX 之间的整数。
如下图中,我们直接使用rand方法生成10个随机数:
#include<stdio.h>
#include<stdlib.h>
int main(){
int a[10];
for(int i=0;i<10;i++){
a[i]=rand();
}
printf("random numbers:");
for(int i=0;i<10;++i){
printf("%c%d",(i==0?' ':','),a[i]);
}
printf("\n");
return 0;
}
代码结果运行总是这些“伪随机数”41,18467…
rand函数虽然生成随机数,但可以说是一个伪随机。因为每次调用时,生成数字顺序都是固定的。
3.srand函数:作为rand的种子
为了在每次调用时生成不同的随机数,使用srand函数初始化随机数种子。只要随机数种子变化了,那么生成的随机数就会改变。通常,srand使用当前时间作为种子:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int a[10];
srand(time(0));
for(int i=0;i<10;i++){
a[i]=rand();
}
printf("random numbers:");
for(int i=0;i<10;++i){
printf("%c%d",(i==0?' ':','),a[i]);
}
printf("\n");
return 0;
}
其中time函数的参数是指针,0转换为合适的空指针NULL
" time(0)==time (NULL) "
随机数每次运行的结果都不同:
1.随机种子的优化:
但使用时间作为随机数种子是否安全呢?我们目前程序运行中执行的速度都太快了,一秒钟对于计算机来说太漫长了,程序中多个随机种子结果会相同。
- 我们将生成随机数的操作定义为函数,然后调用函数两次,看生成的随机数仍然时一样。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int generateRand(){
int a[10];
srand(time(0));
for(int i=0;i<10;i++){
a[i]=rand();
}
printf("random numbers:");
for(int i=0;i<10;++i){
printf("%c%d",(i==0?' ':','),a[i]);
}
printf("\n");
return 0;
}
int main(){
printf("first geet random code \n");
generateRand();
printf("first geet random code \n");
generateRand();
return 0;
}
两个随机种子的随机数是一样的结果:
优化函数也比较简单,在使用时间的基础上,我们还加上一个定增序号。这样能保证就算同一秒钟内多次调用,随机数的种子都是不一样的。
static unsigned int seq=0; //优化:额外使用定增序号
int a[10];
srand(time(0)+(seq++));
4.控制随机数的范围
1.用取模运算符控制
通常,我们需要获取一定范围内的随机数。所以,在生成随机数之后我们使用模运算获取对应范围内的数据。
如生成0到100内的随机数
a[i]=rand()%100;//控制随机数0~99