java中的Random()注意!

news/2024/7/5 4:01:27
Random 类专门用于生成一个伪随机数,他有两个构造函数:一个构造函数使用默认的种子,另一个构造函数需要程序员
显示传入一个long 类型的种子。同时他提供了很多方法来生成伪随机数。即如果类的两个实例时用同一个种子创建的,
对他们以同样的顺序调用方法,则他们会产生相同的数字序列。
下面做个试验验证一下,当两个Random对象的Seed相同时,他们会产生相同的数字序列,需要注意的是,当使用默认的种子
构造Random对象时,那么他们的seed就相同,属于同一个seed。

import java.util.Random;
class  SeedTest
{
public static void sop(Object obj)
{System.out.println(obj);
}
public static void main(String[] args) 
{Random r1 = new Random(50);sop("第一个seed为50的随机数对象:");sop("r1.nextBoolean():\t" + r1.nextBoolean());sop("r1.nextInt():\t\t" + r1.nextInt());sop("r1.nextDouble():\t" + r1.nextDouble());sop("r1.nextGaussian():\t" + r1.nextGaussian());sop("-------------------------------------------");Random r2 = new Random(50);sop("第二个seed为50的随机数对象:");sop("r2.nextBoolean():\t" + r2.nextBoolean());sop("r2.nextInt():\t\t" + r2.nextInt());sop("r2.nextDouble():\t" + r2.nextDouble());sop("r2.nextGaussian():\t" + r2.nextGaussian());sop("-------------------------------------------");Random r3 = new Random(100);sop("第三个seed为100的随机数对象:");sop("r3.nextBoolean():\t" + r3.nextBoolean());sop("r3.nextInt():\t\t" + r3.nextInt());sop("r3.nextDouble():\t" + r3.nextDouble());sop("r3.nextGaussian():\t" + r3.nextGaussian());sop("--------------over-------------------------");
}
}

运行结果:
第一个seed为50的随机数对象:
r1.nextBoolean():       true
r1.nextInt():           -1727040520
r1.nextDouble():        0.6141579720626675
r1.nextGaussian():      2.377650302287946

第二个seed为50的随机数对象:
r2.nextBoolean():       true
r2.nextInt():           -1727040520
r2.nextDouble():        0.6141579720626675
r2.nextGaussian():      2.377650302287946

第三个seed为100的随机数对象:
r3.nextBoolean():       true
r3.nextInt():           -1139614796
r3.nextDouble():        0.19497605734770518
r3.nextGaussian():      0.6762208162903859

从上面运行结果来看,如果两个Random对象的种子相同,而且方法的调用顺序也相同,则他们会产生相同的
数字序列,这也说明,Random 产生的数字并不是真正随机的,而是一种伪随机。
所以为了避免两个Random对象产生相同的数字序列,开发时通常推荐使用当前时间来作为Random对象的种子
即:

转载于:https://www.cnblogs.com/yangzhi/archive/2012/10/16/3576628.html


http://lihuaxi.xjx100.cn/news/251441.html

相关文章

ip通信(第二周)

计算机网络分为局域网(LAN)、城域网(MAN)和广域网(WAN)。拓扑结构分为星型网,树形网,分布式网络,总线型网络,环型网络和复合型网络。认识了几个常见的国际标准…

【数据结构】拓扑排序

如果一个有向图中没有包含简单的回路,这样的图为有向无环图。 图中的顶点代表事件(活动),图中的有向边说明了事件之间的先后关系。这种用顶点表示活动,用弧表示活动时间的优先关系的有向图称为顶点表示活动的网&#…

2021-2022-1 线性代数知识点总结的视频

01 线性方程组02 矩阵及其运算03 向量空间(上)03 向量空间(下)04 特征值与特征向量05 实对称矩阵与二次型2021 线性代数 第三章 习题课2021 线性代数 第四章 习题课2021-2022-1 线性代数考试要点2021-2022-1 线性代数知识点总结 …

linux sntp 代码,C语言window(linux)平台的SNTP实现

C语言实现window(linux)平台的SNTP,本程序功能主要是实现电脑(或者设备)时间同步。摘录部分代码:unsigned char liVnMode; /* LeapSecond(2bits:0), VersionNumber(3bits: 3), Mode(3bits: Client3, Server4) */unsigned char stratum; /* 时间层级 (0-1…

消息服务发送短信,手机接收不到短信解决思路

阿里云使用消息服务,发送注册码给手机。测试几次发现手机都接收不到,后台也没报错!今天我提交自己的工单,售后工程师已经帮我解决了,非常感谢他!官方代码:https://help.aliyun.com/document_det…

【数据结构】关键路径

在有向图中,如果用顶点表示事件,弧表示活动,弧上的权值表示活动持续的时间,这样的活动称为边表示活动的网,简称AOE网(Activity On Edge)。通常可以用AOE网来估算工程的完成时间,他不…

VC:其他控件(CProgressCtrl、CScrollBar、CDateTimeCtrl、CMonthCalCtrl)

1、进度条 m_progressCtrl.SetRange(0,100); for(int i0;i<100;i) { m_progressCtrl.SetPos(i); Sleep(100); } AfxMessageBox("进度条到达终点"); 2、滑块控件&#xff1a;添加WM_VSCROLL消息。 void COtherCtrlDlg::OnHScroll(UINT nSBCode, UINT nPos, CScroll…

linux孤立cpu,Linux 抛弃旧款 CPU,一下子少 50 万行代码

IT 之家4 月 3 日消息 Linux 内核维护者已经决定在即将发布的新版本中抛弃对旧款 CPU 架构的支持&#xff0c;因此 Linux 4.17 内核将减少大约 500000 行代码&#xff0c;根据 Linux 统计器&#xff0c;目前它包含大约 2030 万行代码。IT 之家报道&#xff0c;将被弃用的体系架…