• 平方取中法生成伪随机数序列+python实现


    平方取中方法是1946年由John Von Neumann,S. Ulm和N. Metropolis 在Los Alamos实验室研究中子碰撞时提出的,他们当时的研究工作是曼哈顿项目的一部分。他们的平方取中法如下:

    1. 从一个4位数x0开始,称为种子.

    2. 将它平方得到一个8位数(必要时在前面加0).

    3. 取中间的4位数作为下一个随机数.

    按上述方式进行就能得到一个数列,它是从0到9999随机出现的整数,这些整数可以换算到任何从a到b的区间,例如,若想要从0到1的数,只需用10 000除这些4位数。

    例如:

    取一个种子,比如x0 = 2041,将它平方(前面加0)得到04165681,中间的4位数1656就是下一个随机数。用这个方法生成的9个随机数是

    n

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    xn

    2041

    1656

    7423

    1009

    0180

    0324

    1049

    1004

    80

    64

    40

    16

    2

    如果愿意的话,可以采用多于4位的数字,但是总要取中间的、与种子数字数目相同的那个数字作为下一个随机数。如设x0=653217(6位数字),它的平方426 692 449 089有12位数字,取中间的6位数为692 449.

    平方取中方法是有道理的,但是它的一个主要缺点是它会退化为0(并永远停在这里)。

    python实现代码:

     1 import numpy as np
     2 
     3 #创建一个列表来存储随机数
     4 randomlist = []
     5 
     6 #设置一个四位数的随机数
     7 seed = np.random.randint(1000,10000)
     8 
     9 #将种子作为第一个随机数
    10 randomlist.append(seed)
    11 
    12 while(len(randomlist) <= 10000):
    13 
    14     #计算随机数的平方
    15     seedsquare = seed ** 2
    16 
    17     #获取随机数平方的长度,如果长度不是8,前面用0补齐
    18     seedsquare_str = str(seedsquare)
    19     if len(seedsquare_str) != 8:
    20         seedsquare_str = seedsquare_str.rjust(8,'0')
    21 
    22     #获取该随机数平方的中间四位
    23     seedsquare_4 = seedsquare_str[2:6]
    24 
    25     #将取出的随机数平方的中间四位作为随机数加入随机数列表
    26     randomlist.append(seedsquare_4)
    27 
    28     #将取出的随机数平方的中间四位作为新的种子
    29     seed = int(seedsquare_4)
    30     continue
    31 
    32 for randint in randomlist:
    33     print(randint,end=' ')
  • 相关阅读:
    awk-使用
    缓存使用
    一致性hash-java实现treemap版
    线程同步-CountDownLatch
    一致性hash算法
    linux-配置字符串-grep
    linux-查找命令-find
    linux-网络监控命令-netstat进阶
    linux-网络监控命令-netstat初级
    linux-单引号、双引号、反引号的区别。
  • 原文地址:https://www.cnblogs.com/hanyu1995/p/14658844.html
Copyright © 2020-2023  润新知