伪随机数C++ 中的伪随机数,例如rand(),是怎么生成的?
什么是伪随机数列
如果一个序列,一方面它是可以预先确定的,并且是可以重复地生产和复制的;一方面它又具有某种随机序列的随机特性(即统计特性),我们便称这种序列为伪随机序列。
伪随机序列是具有某种随机特性的确定的序列。
它们是由移位寄存器产生确定序列,然而他们却具有某种随机序列的随机特性。
因为同样具有随机特性,无法从一个已经产生的序列的特性中判断是真随机序列还是伪随机序列,只能根据序列的产生办法来判断。
伪随机序列系列具有良好的随机性和接近于白噪声的相关函数,并且有预先的可确定性和可重复性。
这些特性使得伪随机序列得到了广泛的应用,特别是在CDMA系统中作为扩频码已成为CDMA技术中的关键问题。
特性为序列中两种元素出现的个数大致相等。
能用通俗易懂的话告诉我,为什么计算机产生的随机数都是伪随机数? 请大家指教,谢谢!
真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的。
而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的。
我们可以这样认为这个可预见的结果其出现的概率是100%。
所以用计算机随机函数所产生的“随机数”并不随机,是伪随机数。
为什么说Java中的随机数都是伪随机数
什么是伪随机数?
1.伪随机数是看似随机实质是固定的周期性序列,也就是有规则的随机。
2.只要这个随机数是由确定算法生成的,那就是伪随机,只能通过不断算法优化,使你的随机数更接近随机。
(随机这个属性和算法本身就是矛盾的)
3.通过真实随机事件取得的随机数才是真随机数。
Java随机数产生原理:
Java的随机数产生是通过线性同余公式产生的,也就是说通过一个复杂的算法生成的。
伪随机数的不安全性:
Java自带的随机数函数是很容易被黑客破解的,因为黑客可以通过获取一定长度的随机数序列来推出你的seed,然后就可以预测下一个随机数。
不用种子的不随机性会增大的原因:
java.Math.Random()实际是在内部调用java.util.Random()的,使用一个和当前系统时间有关的数字作为种子数。
两个随机数就很可能相同。
double a = Math.random();
double b = Math.random();
Random r1 = new Random();
r1.nextInt(10);
Random r2 = new Random();
r2.nextInt(10);
Java中产生随机数的方法有两种:
第一种:Math.random()
第二种:new Random()
一、java.lang.Math.Random:
调用这个Math.Random()函数能够返回带正号的double值,取值范围是[0.0,1.0),在该范围内(近似)均匀分布。
因为返回值是double类型的,小数点后面可以保留15位小数,所以产生相同的可能性非常小,在这一定程度上是随机数。
二、java.util.Random:
Random r1 = new Random();
Random r2 = new Random();
Random r3 = new Random(10);
Random r4 = new Random(10);
下面Random()的两种构造方法:
Random():使用一个和当前系统时间对应的相对时间有关的数字作为种子数。
Random(long seed):直接传入一个种子数。
种子的作用是什么?
种子就是产生随机数的第一次使用值,机制是通过一个函数,将这个种子的值转化为随机数空间中的某一个点上,并且产生的随机数均匀的散布在空间中。
以后产生的随机数都与前一个随机数有关。
举例:
Random r =new Random(100);
System.out.println(r.nextInt(20));
种子数只是随机算法的起源数字,和生成的随机数字的区间没有任何关系。
初始化时100并没有起直接作用(注意:不是没有起作用),r.nextInt(20)中的20是随机数的上限,产生的随机数为0-20的整数,不包括20。
2.为什么说java中的随机数都是伪随机数
1.伪随机数是看似随机实质是固定的周期性序列,也就是有规则的随机。
2.只要这个随机数是由确定算法生成的,那就是伪随机,只能通过不断算法优化,使你的随机数更接近随机。
(随机这个属性和算法本身就是矛盾的)
3.通过真实随机事件取得的随机数才是真随机数。
Java中产生随机数的方法有两种:
第一种:Math.random()
第二种:new Random()C++ 中的伪随机数,例如rand(),是怎么生成的?
class mtrandom
{
public
mtrandom() : left(1) { init(); }
explicit mtrandom(size_t seed) : left(1) { init(seed); }
mtrandom(size_t* init_key, int key_length) : left(1)
{
int i = 1, j = 0;
int k = N > key_length ? N : key_length;
init();
for(; k; --k){
state[i] = (state[i] ^ ((state[i - 1] ^ (state[i - 1] >> 30)) * 1664525UL))+ init_key[j] + j; // non linear
state[i] &= 4294967295UL; // for WORDSIZE > 32 machines
++i;
++j;
if(i >= N){
state[0] = state[N - 1];
i = 1;
}
if(j >= key_length)
j = 0;
}
for(k = N - 1; k; --k){
state[i] = (state[i] ^ ((state[i - 1] ^ (state[i - 1] >> 30)) * 1566083941UL)) - i; // non linear
state[i] &= 4294967295UL; // for WORDSIZE > 32 machines
++i;
if(i >= N){
state[0] = state[N - 1];
i = 1;
}
}
state[0] = 2147483648UL; // MSB is 1; assuring non-zero initial array100
}
}
妮妮云的来历妮妮云是 789 陈总 张总 三方共同投资建立的网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑妮妮云的市场定位妮妮云主要代理市场稳定速度的云服务器产品,避免新手购买云服务器的时候众多商家不知道如何选择,妮妮云就帮你选择好了产品,无需承担购买风险,不用担心出现被跑路 被诈骗的情况。妮妮云的售后保证妮妮云退款 通过于合作商的友好协商,云服务器提供2天内全额退款到网站余额,超过2天...
昨天,有在"阿里云秋季促销活动 轻量云服务器2G5M配置新购年60元"文章中记录到阿里云轻量服务器2GB内存、5M带宽一年60元的活动,当然这个也是国内机房的。我们很多人都清楚备案是需要接入的,如果我们在其他服务商的域名备案的,那是不能解析的。除非我们不是用来建站,而是用来云端的,是可以用的。这不看到其对手腾讯云也有推出两款轻量服务器活动。其中一款是4GB内存、8M带宽,这个比阿里云还要狠。这个真...
搬瓦工和Vultr哪个好?搬瓦工和Vultr都是非常火爆的国外VPS,可以说是国内网友买的最多的两家,那么搬瓦工和Vultr哪个好?如果要选择VPS,首先我们要考虑成本、服务器质量以及产品的售后服务。老玩家都知道目前在国内最受欢迎的国外VPS服务商vultr和搬瓦工口碑都很不错。搬瓦工和Vultr哪个稳定?搬瓦工和Vultr哪个速度快?为了回答这些问题,本文从线路、速度、功能、售后等多方面对比这两...
伪随机数为你推荐
在线课堂钉钉群直播和在线课堂的区别?gravatar游戏王mycrad怎样换头像?溢出隐藏overflow:hidden用在哪里?网关和路由器的区别路由器和网关有什么区别?deviceid怎么能知道安卓系统手机的DEVICE ID?inode智能客户端inode智能客户端无法正常启动,根本开都开不了php论坛怎样快速在个人电脑上建立一个自己的PHP论坛服务器?有b吗34B的胸围有多大?smartuploadSmartUpload组建实现文件上传下载,我要把文件保存到项目中的某个文件夹中,该如何实现?最好有程序参考smartupload使用SmartUpload实现文件上传时需要对表单设置哪些属性
美国vps推荐 免费申请域名和空间 重庆服务器托管 edgecast 监控宝 tightvnc 申请空间 灵动鬼影 空间出租 韩国名字大全 100m空间 已备案删除域名 183是联通还是移动 河南移动m值兑换 国外ip加速器 独享主机 国内域名 重庆服务器 美国asp空间 winserver2008 更多