伪随机数生成方法
大家好.今天说点儿关于程序设计过程中产生随机数的方法.
(一)JAVA伪随机数生成方法
随机数在程序设计过程中,特别是在实践环境模拟和测试等领域中得到很广泛的应用,我们在编程的过程中也时不时需要使用到随机数.计算机中的随机数,并不是真正的随机数,而是叫做"伪随机数",是计算机通过某种特别算法模拟产生的.
在JAVA语言中,我们可以通过Math类的random方法产生区间[0,1)的随机数,若要产生[a,a+b)之间的伪随机数,可以通过语句 a + b * Math.random(); 来实现.该方法的方法签名为:static double random();
Math类位于java.lang包中,而java.lang包是默认包含的,因此不需要显式使用 import java.lang.*; 语句.在API文档中我们可以知道该类的继承结构:
可以知道,Math类是Obeject类的直接子类,而object类是所有其他类的直接或间接超类.Math类中声明了许多与数学计算相关的实用成员变量和方法成员,如:
static double E; //自然对数的底数
static double PI; //顾名思义,圆周率π
在程序中可以使用它们,来代替实用const double来定义变量.
static double abs(double); //求绝对值方法
static double cos(double); //余弦函数,与此类似,还有正弦sin方法,正切tan方法等
static double pow(double, double); //幂函数
static double sqrt(double); //开算术平方根
......
(二)C/C++中伪随机数生成方法
在C/C++中没有像JAVA中Math.random()这样的方法(函数).使用的是头文件stdlib.h或cstdlib中的rand()函数.函数原型为:int rand(); ,产生一个0 ~ RAND_MAX之间的伪随机整数.RAND_MAX定义在stdlib.h中,我机器上的MinGW编译器的定义为: #define RAND_MAX 0x7FFF
若要产生(0,a)之间的随机数,rand() % (a+1)即可;((double)rand()/RAND_MAX)*(b-a) + a, 产生区间[a,b]上的随机数.
但是,这样生成的伪随机数是一个固定的序列,当再一次使用rand()函数产生随机数时,会产生和之前相同的值.改进方法是重新设置随机数种子(默认为1).使用函数void srand (unsigned int)来设置随机数种子,改变伪随机数序列.
为了是随机数更加具有随机性,通常使用头文件time.h中的time函数的返回值作为随机数种子,如srand((unsigned)time(0));
示例代码如下:
1 #include<iostream> 2 #include<cstdlib> 3 #include<ctime> 4 5 using namespace std; 6 7 int main(){ 8 9 srand((unsigned)time(0)); 10 11 for(int i = 0; i < 10 ;i++) 12 cout<<10+rand()%21<<' '; //10~30之间的随机数 13 14 return 0; 15 }