随机数和伪随机数

转载请说明出处:

点击打开链接 http://blog.csdn.net/wu_lai_314/article/details/8244921


今天在做测试二叉搜索树和其他搜索算法的时间复杂度的实验时候接触了rand()和srand()函数,可以用下面一段小程序来说明这两个函数的功能:

#include <stdio.h>
 #include <iostream>
#include <time.h> 
using namespace std;
#define MAX 100 
int main(int argc, char* argv[]) {
    srand( (unsigned)time( NULL ) );  //srand()函数产生一个以当前时间开始的随机种子  	for (int i=0;i<10;i++) 
  		cout<<rand()%MAX<<endl;  //MAX为最大值,其随机域为0~MAX-1 
 	return 0;
 }

运行了几次后我就发现所谓的随机数其实不是随机的,每次运行的结果总是那么的相似,上网查阅后才对真随机和伪随机数有了些了解,现在总结归纳如下:


首先大家要知道,计算机是结构,条理非常清晰的数理逻辑.它所执行的东西都是按照人们编好的程序一步一步来的.所以它产生并不是真正的随机.我们所说的随机数的输出,仅仅是让计算机获取一切信息,然后根据一连串的算法输出看似随机的数。


举个例子来说,你玩过网游吧,一般的游戏里都有本地图内随机传送的技能或物品.如果真随机的话,你无限次传送可以到达任何一个地方.但如果伪随机的话,无限次传送之后有些地方仍然是无法到达的。计算机通过复杂得计算,让大家看起来好像是数据之类的东西是处于随机状态的,但是他还是有一定的规律。


但是 如果一个算法依赖的信息够大,且够复杂,人力甚至是机器都难以猜出其中的规律,我们就说输出的数是随机的 。比如电脑可以记录鼠标点击次数、鼠标移动范围、键盘操作次数,系统使用时间(确精到毫秒以下)、当前时间(确精到毫秒以下)等不确定因素来做随机因子,这样出来的随机数也算真正随机。



下面是来自 Random.org 的随机数位图



下面是在 Windows 系统上调用 PHP 的 rand() 方法生成的:




看起来并不随机是吧?

代码如下:

// Requires the GD Library

header("Content-type: image/png");

$im = imagecreatetruecolor(512, 512)

    or die("Cannot Initialize new GD image stream");

$white = imagecolorallocate($im, 255, 255, 255);

for ($y=0; $y<512; $y++) {

    for ($x=0; $x<512; $x++) {

        if (rand(0,1) === 1) {

            imagesetpixel($im, $x, $y, $white);

        }

    }

}       

imagepng($im);

imagedestroy($im);


下面有个RANDOM.ORG的官方网站

官方主页:http://www.random.org


转载请说明出处:

点击打开链接 http://blog.csdn.net/wu_lai_314/article/details/8244921








你可能感兴趣的:(随机数和伪随机数)