伪随机数生成方法

Posted hxb316

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了伪随机数生成方法相关的知识,希望对你有一定的参考价值。

大家好.今天说点儿关于程序设计过程中产生随机数的方法.

       (一)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 }
复制代码

 

以上是关于伪随机数生成方法的主要内容,如果未能解决你的问题,请参考以下文章

伪随机数生成算法-梅森旋转(Mersenne Twister/MT)

类Random

C语言 rand()伪随机数函数怎么生成随机数种子?(srand(time))(生成[m, n]范围内随机数方法)

固定密度为 1s 的伪随机数生成器

伪随机目录树生成?

Matlab之rand(), randn(), randi()函数的使用方法