Table of Contents:
  1. 模块说明
    1. 随机数实现原理解读
      1. 方法用途表
        1. 方法使用介绍, 默认预先引入import random
          1. random.seed
            1. random.random
              1. random.uniform
                1. random.randint
                  1. random.randrange
                    1. random.choice
                      1. random.shuffle
                        1. random.sample
                          1. random.triangular

                          Python模块学习7-random

                          Reading Time:The full text has 988 words, estimated reading time: 5 minutes
                          Creation Date:2017-08-07
                          Article Tags:
                          Previous Article:工作一个月零两天
                           
                          BEGIN

                          模块说明

                          random模块用于生成随机数,是对常用的模块之一。

                          随机数实现原理解读

                          1. 梅森旋转算法(Mersenne twister)实现伪随机数,random.random()方法应用此算法生成随机数。

                          以下摘录自维基百科:

                          梅森旋转算法(Mersenne twister)是一个伪随机数发生算法。由松本真和西村拓士[1]在1997年开发,基于有限二进制字段上的矩阵线性递归 {\displaystyle F_{2}} F_{{2}}。可以快速产生高质量的伪随机数,修正了古典随机数发生算法的很多缺陷。

                          Mersenne Twister这个名字来自周期长度取自梅森素数的这样一个事实。这个算法通常使用两个相近的变体,不同之处在于使用了不同的梅森素数。

                          # step 1 用于初次取值
                          import time # 此时时间用于示例:time.time() => 1502074600.148464
                          a = long(time.time() * 256) # a = 384531097638L
                          a, x = divmod(a, 30268) # a = 12704212L, x = 8822L
                          a, y = divmod(a, 30306) # a = 419L, y = 5998L
                          a, z = divmod(a, 30322) # a = 0L, y = 419L
                          # step 2
                          x, y, z = int(x)+1, int(y)+1, int(z)+1 # x = 8823, y = 5999, z = 420
                          x = (171 * x) % 30269 # x = 25552
                          y = (172 * y) % 30307 # y = 1390
                          z = (170 * z) % 30323 # z = 10754
                          # 注:此时的x、y、z值继续用于step2中计算
                          print (x/30269.0 + y/30307.0 + z/30323.0) % 1.0 # 0.24467627476378095
                          1. 三角分布算法(Triangular distribution),将随机数处理后让其更接近众数,如众数为0.5,随机数为0.22时处理后可能是0.33, 随机数为0.8时处理后可能为0.7。

                          random.triangular()方法应用此算法。

                          import random
                          u = random.random() #0到1之间的随机浮点数
                          low = 0 #最小值
                          high = 1 #最大值
                          c = 0.5 #指定众数,表示最接近的数
                          if u > c:
                              u = 1.0 - u
                              c = 1.0 - c
                              low, high = high, low
                          print low + (high - low) * (u * c) ** 0.5

                          方法用途表

                          函数名原型用途
                          randomrandom(self)返回一个[0, 1)的浮点数
                          uniformuniform(self, a, b)返回一个[a, b)的浮点数
                          randintrandint(a, b)返回一个[a, b]的整数
                          randrangerandrange(start, stop=None, step=1, _int=int, _maxwidth=1L<<BPF)>>)返回一个[start, start+step, …, stop)之间的随机整数
                          choicechoice(seq)随机返回一个数组中的成员
                          shuffleshuffle(x, random=None)修改x,将数组x中的元素乱序
                          samplesample(population, k)从数组population中随机取出k个数
                          triangular不常用用于三角形分布
                          normalvariate不常用正太分布
                          lognormvariate不常用对数正太分布
                          paretovariate不常用帕累托分布
                          gauss不常用高斯分布
                          gammavariate不常用伽马分布
                          betavariate不常用β分布
                          expovariate不常用指数分布
                          weibullvariate不常用Weibull分布

                          方法使用介绍, 默认预先引入import random

                          random.seed

                          seed(a=None):参见 随机数实现原理解读 中的step1,默认使用当前时间戳,可通过传递a参数自定义数值。

                          random.random

                          random():返回一个大于等于0小于1的浮点数
                          random.random() # 0.396058242610681

                          random.uniform

                          uniform(a, b):返回一个大于等于a小于b的浮点数
                          random.uniform(1, 10) # 1.9284943080764423

                          random.randint

                          randint(a, b):返回一个大于等于a小于等于b的整数,底层调用randrange(a, b)
                          random.randint(1,10) # 9

                          random.randrange

                          randrange(start, stop=None, step=1, _int=int, _maxwidth=1L<<BPF)>>):一般参数_int和_maxwidth使用默认的,返回[start, start+step, …, stop)之间的随机整数。
                          random.randrange(1, 10, 3) # 4

                          random.choice

                          choice(seq):seq为数组,随机返回一个数组中的成员
                          random.choice([1, 3, 5]) # 3

                          random.shuffle

                          shuffle(x, random=None):x为数组,random为随机数生成函数,默认为自带的,作用是修改x将x中的成员乱序,此方法不返回内容

                          x = [1, 3, 5]
                          random.shuffle(x)
                          print x # [1, 5, 3]

                          random.sample

                          sample(population, k):population为数组,此方法从population中随机取出k位返回
                          random.sample([1, 3, 5], 2) #[1, 5]

                          random.triangular

                          triangular(self, low=0.0, high=1.0, mode=None):返回随机数经三角分布算法处理后的值,low为下限,high为上限,mode为众数,将随机数处理后更接近众数,参见 随机数实现原理解读 中的 三角分布算法 介绍。

                          FINISH
                          Previous Article:工作一个月零两天

                          Random Articles
                          Life Countdown
                          default