伪随机数生成方法

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

(一)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 }

时间: 2024-08-10 19:08:10

伪随机数生成方法的相关文章

[计算机漫谈]伪随机数生成方法

大家好.今天说点儿关于程序设计过程中产生随机数的方法. (一)JAVA伪随机数生成方法 随机数在程序设计过程中,特别是在实践环境模拟和测试等领域中得到很广泛的应用,我们在编程的过程中也时不时需要使用到随机数.计算机中的随机数,并不是真正的随机数,而是叫做"伪随机数",是计算机通过某种特别算法模拟产生的. 在JAVA语言中,我们可以通过Math类的random方法产生区间[0,1)的随机数,若要产生[a,a+b)之间的伪随机数,可以通过语句 a + b * Math.random();

如何评价一个伪随机数生成算法的优劣

以下来自我在知乎的回答.http://www.zhihu.com/question/20222653 谈到随机性,这大概是一个令人困惑哲学问题吧.随机行为精确地说究竟指的是什么,最好是有定量的定义.Kolmogorov曾提出一种判定随机性的方法: 对于无穷的随机数序列,无法用其子序列描述.J.N.Franklin则认为:如果一个序列具有从一个一致同分布的随机变量中独立抽样获得的每个无限序列 都有的性质,则是随机的.这些定义都不是很精确,有时甚至会导致矛盾.可见数学家在谈到这个问题时是多么的审慎.

git patch生成方法

先把修改commit掉,然后生产修改patch给提交代码的同事,具体操作步骤如下: 修改代码的同事: git format-patch al821_xxx origin/al821_xxx 会生成:0001-HQ00656135-xxx-al821_xxx.patch这样的patch文件 把这个patch给提交代码的同事 提交代码的同事,执行: git am 0001-HQ00656135-xxx-al821_xxx.patch 然后可以检查这个提交记录有没有问题,如果没有问题 执行git pu

C# 代码生成器 (存储过程生成方法)

最近研究C#,发现写代码很麻烦,特别是创建实体.模型.接口.工厂.存储过程之类,网上有些开源的,但是不完整,也不能完整的按需求生成,于是,花了三天的时候,结合前辈的一些经验,整合了一些代码生成器,以下是存储过程的生成方法,可以借鉴一下,水平有限,请多指教. 1 /// <summary> 2 /// 创建存储过程 3 /// </summary> 4 public string GetStorage(CodeTable codeTable) 5 { 6 7 Model.Server

Apache SSL CSR OpenSSL生成方法

注册申请SSL证书时,很多都是需先提供CSR(证书签名请求文件),下面介绍一下Apache生成方法.首先SSH登陆服务器,先搭建好Apache等环境,也需要运行yum install mod_ssl安装SSL模块,然后/etc/init.d/httpd restart重启一下Apache服务. 执行以下命令安装OpenSSL: yum install openssl 接着生成KEY和CSR文件: openssl req -new -nodes -newkey rsa:2048 -keyout s

mif文件生成方法

mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据.常见生成方法: Quartus自带的mif编辑器生成 mif软件生成 高级编程语言生成 前两种方法都有一定的缺陷,主要介绍第三种方法,按照mif文件格式,使用高级编程语言(Matlab.C)编写生成. 注意: mif文件都是ASCⅡ码,负数应该是用补码处理,否则负数在mif文件中会变成0. Matlab参考代码如下: clc;clear;close all; width = 1

UIImage类方法总结及UIImage生成方法对比

1.UIImage 生成方法的对比 Apple官方的文档为生成一个UIImage对象提供了两种方法: 1. imageNamed,其参数为图片的名字:优点:加载时会缓存图片,用于图片的频繁使用:缺点:占用内存 2. imageWithContentsOfFile,其参数也是图片文件的路径.优点:仅加载图片,不会缓存,用于价值次数较少的情况,降低内存消耗 那么两种有什么区别吗? 肯定是有的.根据Apple的官方文档: imageNamed: 这个方法用一个指定的名字在系统缓存中查找并返回一个图片对

mysql数据库3600万测试数据生成方法及优化测试

为公司项目优化调整,需要大容量数据表做测试,测试过程发现了很多有趣的东西,这里一并发出来. 本次测试为myISAM表的大容量数据查询优化所做的测试数据,在测试过程中使用了merge分表,每张表1800万数据,对程序来说,分表操作被包装起来,程序操作如同是同一张表,测试结果较为满意,各位看官可以使用本方法的命令行运行来生成测试数据,也可以借鉴merge分表来拆分大容量数据. 测试数据表准备 CREATE TABLE `time_1` ( `id` bigint(20) NOT NULL AUTO_

SQL Server开发接口生成方法

为提高开发效率,生成固定格式的接口是必须的,以下以提供新增/修改/删除/读取接口为例: 以常见的表结构为例,特殊表结构可自己尝试去调整方法 1.在Test数据库生成方法 if OBJECT_ID('Curdsqlstring','P') is not null DROP PROC Curdsqlstring go CREATE PROCEDURE Curdsqlstring( @TableName sysname ) with encryption AS if OBJECT_ID(@TableN