12
9
2009
0

编程中的随机骗局

本站文章,皆为原创,如需转载,请注明出处,违者必究

计算机随机数的秘密

随机数是数学上一个有趣的概念,它体现着宇宙的奥妙和不可预测,更体现着一种自由意志的存在,是有效的对命运论者的反证。在计算机上,我们经常需要一些随机数来模拟各种随机现象,然而计算机上真的存在随机数吗?

我们首先需要理解如何用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);   
}

 

Category: 程序开发 | Tags: | Read Count: 2022

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com