在头文件stdlib.h中的rand函数
int rand(void);
void srand(unsigned int seed);
rand函数不是真正的随机数生成器,而是srand会设置供rand使用的随机数种子。
如果在第一次调用rand之前没有调用srand,那么系统会自动为你调用srand。而使用同种子相同的数调用rand会导致相同的随机数序列被生成。
srand((unsigned)time(NULL))
则使用系统定时/计数器的值作为随机种子。每个种子对应一组根据算法预先生成的随机数,所以,在相同的平台环境下,不同时间产生的随机数会是不同的,相应的,若将srand(unsigned)time(NULL)改为srand(TP)(TP为任一常量),则无论何时运行、运行多少次得到的“随机数”都会是一组固定的序列,因此srand生成的随机数是伪随机数。
rand函数产生一个0到RAND_MAX的伪随机数,这里的RAND_MAX因不同的实现而异,但RAND_MAX至少为32767。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i;
for(i=0;i<10;i++)
printf("%d ",rand());
printf("\n");
return 0;
}
第一次输出内容;41 18467 6334 26500 19169 15724 11478 29358 26962 24464
第二次输出内容:41 18467 6334 26500 19169 15724 11478 29358 26962 24464
.
.
.
第n次输出内容:41 18467 6334 26500 19169 15724 11478 29358 26962 24464
每次设下的随机数种子seed都是1.
系统在调用rand()之前都会自动调用srand(),如果用户在rand()之前曾调用过srand()给参数seed指定了一个值,那么 rand()就会将seed的值作为产生伪随机数的初始值;
而如果用户在rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始值。如果给了一个定值,那么每次rand()产生的随机数序列都是一样的~~
所以为了避免上述情况的发生我们通常用srand((unsigned)time(0))或者srand((unsigned)time(NULL))来 产生种子。如果仍然觉得时间间隔太小,可以在(unsigned)time(0)或者(unsigned)time(NULL)后面乘上某个合适的整数。 例如,srand((unsigned)time(NULL)*10)
time(NULL)的结果是一个数字,每秒都在递增1,也就达成了rand函数使用的种子在不断变换的效果。
需要引用头文件#include<time.h>
不同背景和前景下输出不同内容。
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<math.h>
#include<time.h>
#define N 100
char randk()
{
char ch=0;
ch=(char)abs(rand()%16);
if(ch>=10)
ch=ch-10+'A';
else
ch+='0';
return ch;
}
int main()
{
srand((unsigned)time(NULL));//使用系统定时/计数器的值作为随机种子
char str[10]="color ";
for(int i=0;i<N;i++)
{
str[6]=randk();
str[7]=randk();
system(str);
puts("内容");
Sleep(200);
system("cls");
}
}
拓展
要想生成指定范围的随机数需要使用到求余运算符%
如果我们需要0-10的随机数
rand()%11;
可以达到这个效果,同样0-100写成
rand()%101;
求0-n的随机数,使用rand()%(n+1);