zoukankan      html  css  js  c++  java
  • [Z]K.I.S.S.Random Genrator “保持简单”随机数发生器

    (假)随机数发生器是Monte Carlo算法的基础,自然大家格外关注。
    近几年,日本某君发明的Mersenne Twister[Makoto Matsumoto]可谓其中翘楚。
    不过,它并非尽善尽美。一则它不适合用于数据加密,二则不能通过一些统计检验。
    三嘛就是源程序比较长,不是一眼就能看明白的。

    反过来,上世纪90年代后期就被Marsaglia[Marsaglia]发明出来的Keep-It-Simple-And-Stupid
    算法却挺有趣而简短,而且能打通DIEHARD的各种检验[DIEHARD]。

    下面是源代码:
    unsigned int x = 123456789,
             y = 362436000,
                 z = 521288629,
                 c = 7654321; /* Seed variables */ 
     
    unsigned int KISS()
    {  
        unsigned long long t, A = 698769069ULL;  

        x = 69069*x+12345;  
        
        y ^= (y<<13); y ^= (y>>17); y ^= (y<<5);  
        
        t = (A*z + c);
        c = (t >> 32);
        z = t;
         
        return x+y+z;  
    }

    居然就只是把“线性同余”,“移位轮转”和“带记忆乘法”这3种基本的随机数发生法一起用,
    便获得很好的效果。的确够巧的,从这一点上说,比Mersenne Twister要有趣多了。
    而且通过它,我们一次就学会3种随机数发生法。抽出其中任何1种,都可以单独使用,仿佛一把瑞士军刀。

    [Makoto Matsumoto]Mersenne Twister Home Page
    http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
    [Marsaglia]George_Marsaglia Wiki Page
    en.wikipedia.org/wiki/George_Marsaglia
    [DIEHARD]The Marsaglia Random Number CDROM
    http://stat.fsu.edu/pub/diehard/

  • 相关阅读:
    Linux常见问题解决
    (转)CoreDNS:Kubernetes内部域名解析原理、弊端及优化方式
    (转)Go sync.WaitGroup的用法
    (转)5个维度对 Kubernetes 集群优化及压测方案
    使用 Alpine 作为基础镜像时可能会遇到的常见问题的解决方法
    提前预防K8s集群资源不足的处理方式配置
    docker runc升级
    Nginx常见问题解决
    DNS泛域名解析应用(nip.io)
    使用Velero备份Kubernetes集群
  • 原文地址:https://www.cnblogs.com/waytofall/p/2964509.html
Copyright © 2011-2022 走看看