随机数种子与随机数
来源:互联网 发布:汉诺塔递归算法伪代码 编辑:程序博客网 时间:2024/04/27 21:49
本文要讨论的内容就是,在C语言中,是如何取得这个随机数的?
一个语句:rand();
它的作用就是随机取0到RAND_MAX之间的任何数。ANSI标准指出,RAND_MAX值的范围到少是32767,也就是双字节整数的最大值。
下面我们用一个例子来取得从1到6的随机整数:
#include <stdio.h>
#include <stdlib.h>
main()
{
int i;
for(i=1;i<=20;i++)
printf("%10d",1+(rand()%6));
}
第2行的stdlib.h是rand()函数的头文件,第7行就是 实现功能的语句了。前面我们以经说过函数取的值是介于0到RANDMAX之前的,而我们所要的是1到6之间的整数。用脚想一想就知道:任一整数除以6所得的余数是0~5之间的整数,再加一之后就是1到6了,也就是我们的目标。利用这个原理我们使用%号对随机数进行了缩放。
OK,运行两次程序:
一:6 6 5 5 6 5 1 1 5 3 6 6 2 4 2 6 2 3 4 1
二:6 6 5 5 6 5 1 1 5 3 6 6 2 4 2 6 2 3 4 1
发现:两次运行的结果完全一样。
结论:这算什么随机数。
具有讽刺意味的是,这种重复性是rand的一个重要特点,在调试程序时,这种重复性是必不可少的,因为它可以证明对程序的修改能够正常运行。
实际上,rand函数产生的是伪随机数。但我们需要的是随机数。于是,我们需要对程序进行随机化,这需要使用标准库函数srand来实现。函数srand需要一个无符号的整型参数,在每次程序执行时用函数rand去生在一组不同的随机数。如下例:
#include <stdlib.h>
#include <stdio.h>
main()
{
int i;
unsignde seed;
printf("Enter a seed:");
scanf("%u",&seed);
srand(seed);
for( i = 1;i<=20;i++)
printf(""%10d",1+(rand()%6));
}
程序的运行结果是当我们输入不同的SEED时,产生不同组的随机数。这句话的意思有两个:一:当输入相同的SEED时,产生的同组随机数;二:每次运行我们都要输入一个SEED。
如果我们希望不用每次输入SEED值,而且每次运行时SEED值都是不同的,我们可以用下面语句代替上面的第三块的三个语句:
srand(time(NULL));
这会使计算机自动读取自己的时钟以获得SEED值。于是我们就获值了每次运行都会改变的SEED,同样也就获得了真正的随机数。
- 随机数种子与随机数
- 随机数与随机种子
- 随机数与随机种子
- 随机数种子
- c++中的随机数与种子
- 随机种子与伪随机数
- 随机数、随机数种子
- 随机数---应用随机数种子
- 随机数和随机数种子
- C#中的随机数种子
- 随机数种子的作用
- 随机数 & 随即种子
- 根据种子生成随机数。
- delphi随机数种子
- erlang 随机数种子
- Java random 随机数种子
- matlab 随机数种子
- C++置随机数种子
- Java 反射机制深入研究
- 思想的盛宴--读《天才在左疯子在右》
- 上网祭祖
- 【转帖】未来的选择,ARM+Android还是 MeeGo+X86?(zt)
- 一个U盘病毒汇编源码分析
- 随机数种子与随机数
- 再谈分割窗口
- 怎样制作VS2008.NET应用程序的安装包
- 证券投资五本书
- OSI七层网络模型与TCP/IP四层网络模型
- 虚拟带库为什么不可能代替带库
- 友元函数
- 基于Visual Studio2010讲解C#4.0语法(2)--使用XQuery引擎操作XML文档
- 利用PDFBox提取pdf文件文本内容的分析