如何在C语言中定义一个从1~7的随机数?
rand()函数可以用来生成随机数,但这不是真随机数,而是伪随机数。这是一个基于一个数的递归公式计算出来的系数,我们可以称之为物种。当这个数列很大时,符合正常公布,相当于生成一个随机数,但不是真正的随机数。电脑正常开机的时候,这个种子的值是固定的(也就是你会产生的随机数已经固定了,每次运行都会产生相同的随机数),除非你破坏系统。
为了改变这个种子的值,C提供了srand()函数,它的原型是void srand( int a)。
将随机生成器初始化为rand()函数的初始值,即使种子的值更改为a;由此可见,我们可以通过sand()函数生成可预测的随机序列,那么如何才能生成不可预测的随机序列呢?我们可能经常需要这样的随机序列,对吧?使用SRAND ((unsigned) (time (null))是一种方法,因为每次运行程序的时间都不一样。
下面说说C语言提供的随机数生成器的用法。现在所有的C编译器都提供了一个基于ANSI标准的伪随机数生成器函数来生成随机数。它们是rand()和srand()函数。这两个功能的工作过程如下:
1)首先为srand()提供一个种子,它是一个无符号的int类型,取值范围为0到65535;
2)然后调用rand(),它将根据提供给srand()的种子值返回一个随机数(0到32767之间)。
3)根据需要多次调用rand(),从而不断得到新的随机数;
4)随时可以为srand()提供新的种子,从而进一步“随机化”rand()的输出结果。
以下是生成随机数的示例:
需要先用随机数“种子”初始化,srand函数:
#i包括& ltstdlib.h & gt
#i包括& ltstdio.h & gt
#i包括& lttime.h & gt//使用当前时钟作为种子
无效总管(无效)
{
int I;
srand((无符号)时间(空));//初始化一个随机数
/*打印10随机数。*/
for(I = 0;我& lt10;i++)
printf( " %d\n ",rand());
}
在C语言中如何得到这个随机数?
一句话:兰德();
它的作用是随机取0到RAND_MAX之间的任意数。根据ANSI标准,RAND_MAX值的范围至少是32767,这是双字节整数的最大值。让我们用一个例子来得到一个从1到6的随机整数:
# include & ltstdio.h & gt
# include & ltstdlib.h & gt
主()
{
int I;
for(I = 1;我& lt=20;i++)
printf("%10d ",1+(rand()% 6));
}
第2行的stdlib.h是rand()函数的头文件。第7行是实现函数的语句。我们之前用的函数的值在0到RANDMAX之间,但是我们要的是1到6之间的整数。用脚想想就知道,任意一个整数除以6得到的余数是0到5之间的整数,加1后就是1到6,这就是我们的目标。利用这个原理,我们使用%符号来缩放随机数。
好,运行程序两次:
一:665565651 1 536624 2623 41
两个:665565651 1 536624 2623 41
发现两次运行的结果完全相同。
结论:这是一个随机数。
这种可重复性是rand的一个重要特点,在调试程序时必不可少,因为这可以证明对程序的修改可以正常运行。
事实上,rand函数产生伪随机数。但是我们需要的是随机数。所以我们需要将程序随机化,这需要使用标准库函数srand来实现。函数srand需要一个无符号整数参数,每次执行程序时用函数rand生成一组不同的随机数。
所以另一句话是:srand()然后rand()
# include & ltstdlib.h & gt
# include & ltstdio.h & gt
主()
{
int I;
未签名的种子;
printf("输入种子:");
scanf("%u ",& amp种子);
srand(种子);
for(I = 1;我& lt=20;i++)
printf(" % 10d ",1+(rand()% 6));
}
程序运行的结果是,当我们输入不同的种子时,会产生不同组的随机数。这句话有两层意思:第一,输入同一个种子,产生同一组随机数;二:每次运行,我们都要输入一个种子。
如果我们不想每次都输入种子值,并且每次运行时种子值都不同,我们可以用下面的语句替换上面第三个块中的三个语句:
srand(time(NULL));
这将使计算机自动读取自己的时钟,以获得种子值。所以我们得到了每次运行都会改变的种子,也得到真正的随机数。
//注意:rand()生成一个介于0和RAND_MAX之间的数(比如0~32767,我试了几次,最大rand _ max只能是32767);
//rand()% n(n & lt;=32767)产生一个0 ~ n的数。
//m+rand()% n(n & lt;=32767)产生一个数m ~ m~m+n n。
//如果要生成一个4字节的int随机数,应该找另外一个方法:
//在网上找到一个:
//int N = 0x 7 fffffff;
//cout & lt;& lt(int)((double)RAND()/(double)(RAND _ MAX+1)* N)& lt;& lt”\ n”;
//但是测试后会是(0 ~ 0x7FFFFFFFFFF)
//还在找。。。