本站文章,皆为原创,如需转载,请注明出处,违者必究
计算机随机数的秘密
随机数是数学上一个有趣的概念,它体现着宇宙的奥妙和不可预测,更体现着一种自由意志的存在,是有效的对命运论者的反证。在计算机上,我们经常需要一些随机数来模拟各种随机现象,然而计算机上真的存在随机数吗?
我们首先需要理解如何用C语言实现随机数的生成,根据POSIX和ANSI手册,我们需要使用如下的代码从而产生随机数:
#include <stdio.h> #include <math.h> int main() { int i; // 首先需要调用种子生成函数产生随机数 srand(time(NULL)); // 然后每次调用随机数函数都可以得到一个不同的值 for(i=0; i<10; i++) { printf("%d ", rand()); } return 0; }
这是我们得到的结果:
30848 17436 8058 26236 2834 25009 15649 18326 25054 30275
然而,我们需要了解其中的种子到底是做什么用的,于是笔者写下了如下的代码,看看我们发现了什么:
#include <stdio.h> #include <math.h> int main() { int i; srand(1); for(i=0; i<10; i++) { printf("%d ", rand()); } printf("\n"); srand(1); for(i=0; i<10; i++) { printf("%d ", rand()); } printf("\n"); return 0; }
Bingo!这是我们得到的结果:
41 18467 6334 26500 19169 15724 11478 29358 26962 24464 41 18467 6334 26500 19169 15724 11478 29358 26962 24464
哈哈,我们终于发现计算机中随机数的秘密了,计算机中并不存在“自由意志“!
POSIX标准上的解释
NAME
rand, rand_r, srand - pseudo-random number generator
SYNOPSIS
#include <stdlib.h>
int rand(void);
[TSF] int rand_r(unsigned *seed);
void srand(unsigned seed);
在POSIX中,是明确写着,这是一个”伪“随机数!这就是我们的答案。
随机数算法
/* * C/C++ Run Time Library - Version 5.0 * * Copyright (c) 1987, 1992 by Borland International * All Right Reserved. * */ #include <stdlib.h> #define MULTIPLIER 0x015a4e35L #define INCREMENT 1 static long Seed = 1; void srand(unsigned seed) { Seed = seed; } int rand(void) { Seed = MULTIPLIER * Seed + INCREMENT; return((int)(Seed >> 16) & 0x7fff); }