计算机随机数初探

研究过随机数吗?我们都知道电脑里面的随机数其实只是看上去是随机的,产生的过程都是确定的。如果我们有一定的破解能力,我们就能预测得到,下一次机器产生的随机数是哪个值。

在c++编程中,我们总要放一个随机种子,这个种子一般是当前时间,这样我们可以看到每次调用的随机数工厂产生的数值是不一样的。如果我们把随机数种子设定为一个特定的数,那么产生的随机数也是固定的。这样有一个好处,就是方便调试,因为调试的时候肯定不希望每次运行的结果都不一样。

#include<iostream>
#include<ctime>
#include <cstdlib>
using namespace std;
int main()
{

    srand(time(0));//time(0)返回当前时间传到srand里面做随机种子
    int x=rand();

}

但是在真正的计算中我们是希望随机数尽可能真的是随机出来的。所以又两种方法

1用更好的随机方法。算法没有最好的方法,就像排序算法一样,只有适合某种情形。

2用物理硬件:原子衰减检测。电路中量子力学噪声

0先告诉一个惊人的事实

c++ rand() 产生的随机数在[0,RAND_MAX]之间的一个整数.这是一个均匀分布.如果我们希望产出[a,b]之间的随机数通常会这么处理

(rand()%(b-a+1))+a

这种算法导致不是所以的值都是等概率出现的。只有当(b-a+1)可以整除RAND_MAX+1时才可以.假设RAND_MAX为32767那么生成[0

32766]的时候0的概率是其他值出现概率的两倍.一个解决的办法就是先成[0,1]之间的一个值,在放缩到[a,b]区间上.

double v=(double)rand()/RAND_MAX;

result=(int)(V*(b-a))+a;//这里一个书中给的代码是(V*(b-a+1))+a,我认为是错的,因为如果v=1的时候产生的值是b+1,如果我错了请务必告诉我

1介绍一个常用的分布,

如果我们希望以高斯分布的概率产生随机值,让更多的值不要偏离中心太多,那么该怎么做?

一个简单的方法(其实不简单)用randf()产生[0,1]之间的实数随机数,这个randf要自己编程,然后做BOX-Muller变换,这样可以产生两个随机数(买一赠一),不知道那个鸟变换没关系,我也不知道.

float x1,x2,w,y1,y2;
do
{
    x1=2.0*randf()-1.0;
    x2=2.0*randf()-1.0;
    w=x1*x1+x2*x2;
}while(w>=1.0);
w=sqrt((-2.0*log(w))/w);
y1=x1*w;
y2=x2*w;

那么问题来了。如何产生其他的分布?这个要用到中心极限定理。读者可以自己看看资料

2介绍几个不能用于加密的随机数产生算法

之所以说不能用于加密,是应用这种随机数可能使信息被破解的可能性大。

a线性同余生成器

x_(n+1)=(a*x_(n)+b)%m

其中x_(n+1)就是新产生的随机数,x_(n)是之前的数.n是零的话那个就是随机种子吧!a,b是一个参数,m是一个2的次方数(这样便于取余).vb6中这个算法的参数是m=2^24,a=16598013,b=12820163.

b截断线性同余生成器

先用a算法产生一个随机数,然后计算floor[x_(n+1)/k]。k是2的乘方把这个数返回。

当然还有其他的方法,线性反馈移位寄存器算法,逆同余生成器,滞后斐波那契生成器,元胞自动机,线性回归生成器,马特赛旋转法,well算法。

3可用于加密的随机数

blum blum shub算法。isacc,isacc+。这些都是算法,需要者自行百度。

/dev/random

这个是linux上的一个随机源,他基于系统熵返回一个随机数,可以看成一个真正的随机数.因为产生随机数需要系统收集信息,在系统没有足够信息的时候会造成阻塞。

微软的CryptGenRandom

这个也可是被视为真正的随机数,虽然未开源。

时间: 2024-11-14 12:41:11

计算机随机数初探的相关文章

一、解密随机数生成器(1)——真随机数生成器(转)

解密随机数生成器(1)--真随机数生成器 从小就一直很好奇,MP3播放器的随机播放功能是如何实现的,今天读到一篇关于随机数的文章,又勾起了我的那时好奇心,索性上下求索,了解了随机数背后的很多知识,顿觉豁然开朗,特意写这篇文章和大家总结分享一下. 其实,随机数在我们身边无处不在.无论是玩扑克牌麻将骰子时的点数,玩LOL时的玩家匹配,还是高大上的量子物理,核聚变,都无一例外地随机数有关,在混沌理论中,这个世界本身就是一系列随机过程的产物--好吧,有点激动,扯得太远了--作为编程爱好者,应该会发现,每

计算机学科漫谈

在这篇博文里,我想和大家聊一聊自己对计算机学科的理解.当下本科阶段的计算机专业教学涉及计算机学科的方方面面,分类繁杂,有时可能令新人茫然不知所措.那么,对计算机专业的学者来说,什么是最重要的呢?我相信,一千个读者,一千个哈姆雷特,同样的,每个计算机的学习者都有自己对专业的一番认识.如果说本科四年的计算机专业课程是对专业知识的横向积累,那么把握计算机专业的本质的内容则需要纵向的思考.因此我个人的观点是:对计算机系统整体概念的理解在计算机专业学习中尤其关键.于是我把自己对专业的理解和认识总结出来,希

浅谈随机数的生成

Part0:随机数的性质 随机数一般来说符合下面这几个性质. (马尔科夫性)\(1.\)它产生时后面那个数与前面的毫无关系. (不确定性)\(2.\)给定样本的一部分和随机算法,无法推出样本的剩余部分. (不可再现性)\(3.\)其随机样本不可重现. 另外还要说一下统计学伪随机数概念. 统计学伪随机性.统计学伪随机性指的是在给定的随机比特流样本中,1的数量大致等于0的数量,同理,"10""01""00""11"四者数量大致相等

关于随机数的前世今生

提起随机数,大家一定都不陌生.无论是在计算机科学领域,还是现实生活中,随机数的作用都不可小觑. 但随机数究竟是怎么一会事?它的作用是什么?它有事如何产生的? 本文会着重谈计算机的随机数以及产生算法,偏理论的只是会放到另一篇博客上[随机数那些事](https://www.luogu.org/blog/muxii/sui-ji-shuo-wei-wan-cheng-post) # 随机数定义及其性质 想要讨论随机数,首先应该明确一下随机数的定义.毕竟这个东西比较虚,并不像算法那样明确.在各大网上也没

Java中的ReentrantLock和synchronized两种锁定机制的对比

多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 —— synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了. synchronized 快速回顾 把代码块声明为 synchronized,有两个

(转) Java中的ReentrantLock和synchronized两种锁定机制的对比

原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 -- synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并

ReentrantLock详解 以及与synchronized的区别

ReentrantLock lock = new ReentrantLock(); //参数默认false,不公平锁 ReentrantLock lock = new ReentrantLock(true); //公平锁 lock.lock(); //如果被其它资源锁定,会在此等待锁释放,达到暂停的效果 try { //操作 } finally { lock.unlock(); } Java 理论与实践: JDK 5.0 中更灵活.更具可伸缩性的锁定机制 新的锁定类提高了同步性 -- 但还不能现

Java中的synchronized、volatile、ReenTrantLock、AtomicXXX

多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 -- synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了. synchronized 快速回顾 把代码块声明为 synchronized,有两个

[转] Java的ReentrantLock和synchronized两种锁定机制

多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 —— synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了. synchronized 快速回顾 把代码块声明为 synchronized,有两个