来源:ImportNew - 黄小非


Stackoverlfow.com上有一篇有趣的讨论帖


http://stackoverflow.com/questions/15182496/why-does-this-code-print-hello-world


在这篇帖子里提到了如下的程序:


import java.util.*;

 

public class HelloWorld{

 

    public static String randomString(int i)

    {

        Random ran = new Random(i);

        StringBuilder sb = new StringBuilder();

        for (int n = 0; ; n++)

        {

            int k = ran.nextInt(27);

            if (k == 0)

                break;

 

            sb.append((char)('`' + k));

        }

 

        return sb.toString();

    }

 

    public static void main(String[] args){

        System.out.println(randomString(-229985452)+" "+randomString(-147909649));

    }

 

}


明明是在程序里使用了java.util.Ramdom()函数产生随机数,为什么每次打出的结果都是Hello world? 各位程序员,你们怎么看?请务必要独立思考后再看下面的内容哦~


—————–独立思考的分割线—————————


OK,假如你通过独立思考了以后有了答案,那么可以参照一下下面的各种理解,这些都是来自stackoverflow对此问题的回复。


首先看一下这个程序的工作原理:


通过这句命令首先得到的六个数是:


8 5 12 12 15 0


然后,通过new Random(-147909649).nextInt(27)得到的6个数是:


23 15 18 12 4 0


这样一来,根据:sb.append((char) (‘`’+n)); 得到:


8 + 96 = 104 --> h 

5 + 96 = 101 --> e 

12 + 96 = 108 --> l 

12 + 96 = 108 --> l 

15 + 96 = 111 --> o 

23 + 96 = 119 --> w 

15 + 96 = 111 --> o 

18 + 96 = 114 --> r 

12 + 96 = 108 --> l 

4 + 96 = 100 --> d


整个程序的执行就是这样。


关于这个程序的运行原理的解释,最置顶的一个回复如下:


“如果java.util.Random是被一个具体的数字做为“随机数种子”而实例化(在本例中是-229985452和-147909649),那么该实例就会以这个随机数种子作为随机算法产生随机数的基础。


使用同样的种子实例化的Random对象,每次运行时将会遵循同一种模式,产生同样的序列。”

这就是为什么每次运行该程序都会产生同样的结果的原理啦~


当然,关于这个话题,高手林立的Stackoverflow上是不缺乏懂行的专家和见解的。其实对于这个帖子本身,很快就有人论坛上提出了,这不是一个新鲜的问题,之前的某个帖子已经很详细地说明了原理:


参见:


stackoverflow.com/questions/8044570/why-does-the-use-of-random-with-a-hardcoded-seed-always-produce-the-same-results


还有的人就非常精辟地指出了,这是计算机所谓的“伪随机数”问题(详细见扩展阅读),更有部分Geek的回复者从计算机理论和概率论的角度说明了,应该如何找到这些神奇的“随机数种子”。能够把这么一个原意为搞笑的帖子发展到理论的高度~,相信这应该也是计算机科学家的境界和觉悟了吧!


扩展阅读:计算机伪随机数问题


随机数在计算机科学和计算机应用中都扮演非常重要的角色(例如通信、安全、密码等方面)。但是,由于计算机本身的结构和原理,实际上是无法产生出所谓的“绝对随机数”的。也就是说,计算机所产生的随机数,实际上是有某种规律或者模式的“伪随机数”(Pseudo random number)。


如何用计算机程序产生高质量随机数,这是计算机理论科学中的一个非常重要的课题。尤其是在复杂的计算环境下的高质量随机数的产生,需要牵涉到非常高深的计算科学和数学方面的理论研究。


姚期智,美籍计算机科学家,2000年因对计算机伪随机数产生等研究获ACM图灵奖


在计算机随机数产生的理论研究上,美籍华人姚期智(目前任职于清华大学)是世界顶尖的专家。正是因为他在计算理论和伪随机数产生方面多项贡献,于2000年获得了ACM图灵奖,这也是计算机科学领域的最高奖项。


更多相关文章

  1. 2分钟理清计算机、Python和Pip的三角关系
  2. 计算机网络面试知识点(1)基本概述
  3. 计算机网络面试知识点(3)数据链路层
  4. 计算机网络面试知识点(2)物理层
  5. 病毒与故障:漫谈计算机软件的故障应对
  6. 多线程环境下生成随机数
  7. mysql获取某个范围内的随机数,写了个存储过程自动生成随机6为密码
  8. 计算机管理没有mysql服务项的解决方法
  9. 在本地计算机无法启动MySQL服务。错误1067:进程意外终止

随机推荐

  1. putchar函数可以向终端输出一个字符么
  2. C语言怎么获取数组的长度
  3. C语言中求余运算符是什么?
  4. c语言函数声明格式
  5. c语言中定义结构体的保留字是什么?
  6. visualc++6.0怎么使用
  7. c语言中continue作用是什么?
  8. 手把手教你在C语言中如何打印倒三角形
  9. strncmp函数用法详解
  10. C语言中有且唯一的函数是什么函数