【原创】python基础 --- 随机数、随机小数、随机数列等全解!

前言: 在此总结python中常见用于生成随机数、随机数组、随机小数、随机数列表等的各种方法,会持续更新!!!
目前使用的库函数为:

  1. random库
  2. numpy库

一、random库生成随机*

  1. random.random()
  2. random.uniform(a,b)
  3. random.randint(a,b)
  4. random.randrange(a,b,step)
  5. random.chioce(sequence)
  6. random.shuffle()
  7. random.sample(sequence,k)

1.1生成随机整数

生成(a,b)范围内的一个随机整数,包括a,b(均匀分布)

>>> import random
>>> random.randint(1,10)
10
>>> random.randint(1,10)
1

random.randrange函数

random.randrange的函数原型为:random.randrange([start], stop[, step]),从指定范围内,按指定基数递增的集合中 获取一个随机数。

如:random.randrange(10, 100, 2),结果相当于从[10, 12, 14, 16, … 96, 98]序列中获取一个随机数。

random.randrange(10, 100, 2)在结果上与random.choice(range(10, 100, 2) 等效。

1.2生成随机浮点数

random.random()无需参数,生成0-1范围内的小数。(均匀分布)
random.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限

如果a > b,则生成的随机数n: a <= n <= b。如果 a <b, 则 b <= n <= a。

1.3随机选择

random.choice函数

random.choice从序列中获取一个随机元素。其函数原型为:random.choice(sequence)。

参数sequence表示一个有序类型。这里要说明 一下:sequence在python不是一种特定的类型,而是泛指一系列的类型。list, tuple, 字符串都属于sequence。

>>> list=['abc',666,'ok']
>>> random.choice(list)
'ok'

random.sample函数
random.sample的函数原型为:random.sample(sequence, k),从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列。

>>> x=[1,2,3,4,5,6,7]
>>> y=random.sample(x,3)
>>> y
[4, 2, 7]
>>> x
[1, 2, 3, 4, 5, 6, 7]

从原有列表中获取指定个数元素后,不修改原有列表顺序

random.shuffle函数

random.shuffle的函数原型为:random.shuffle(x[, random]),用于将一个列表中的元素打乱

>>> x=[1,2,3,4,5,6,7]
>>> random.shuffle(x)
>>> x
[4, 1, 2, 5, 3, 6, 7]

1.4生成随机数列表

例一: 生成一个一维整数列表,整数范围(0,10),元素个数为10:

>>> list=[random.randint(0,10) for _ in range(0,10)]
>>> list
[10, 4, 7, 9, 6, 4, 5, 7, 3, 4]

>>> list=[random.choice(range(0,10)) for _ in range(0,7)]
>>> list
[2, 2, 8, 4, 0, 9, 7]

例二: 生成一维整数列表,整数范围为(0,10),元素个数为7,并且元素不重复

>>> list=random.sample(range(0,10),7)
>>> list
[0, 7, 2, 5, 9, 4, 3]

或者直接给出0-10的顺序序列,用shuffle()函数将其打乱
取前7个元素构成新列表即可

例三: 生成二维列表,整数范围为(0,10),元素个数为7,并且元素不重复

>>> list=[random.sample(range(0,10),7) for _ in range(3)]
>>> list
[[5, 4, 7, 2, 3, 9, 8], [4, 5, 1, 2, 6, 0, 8], [2, 9, 5, 4, 8, 3, 7]]

例四: 生成二维随机小数列表,且列表相邻小数相加为1

>>> list=[[random.random(),1-random.random()] for _ in range(0,5)]
>>> list
[[0.8968766599881403, 0.19938521097497552], [0.9286790198189612, 0.8404744240400294], [0.3560054380587584, 0.07926684952619589], [0.025104930171715334, 0.8088029379172177], [0.961551047514721, 0.7347595785170253]]

注意:为何第二次可以用1-random.random()呢?
说明,[random.random(),1-random.random()]是作为一句话进行执行的。

二、numpy.random库生成随机数组

  1. np.random.rand()
  2. np.random.randn()
  3. np.random.randint(low[, high, size])
  4. random_integers(low[, high, size])
  5. np.random.shuffle(x)
    用numpy库函数生成的随机数组是 <class ‘numpy.ndarray’>格式。注意,不要与列表混淆。

2.1产生随机数组

  • numpy.random.rand(d1,d2,d3…dn):生成一个[0,1)之间的随机浮点数或N维浮点数组。
>>>import numpy as np
 
>>>np.random.rand(10)    #生成shape = 10 的一维随机数组
Out[1]: 
array([ 0.7154292 ,  0.65042837,  0.99854959,  0.1219843 ,  0.8993502 ,
        0.61108002,  0.18613111,  0.82756742,  0.77026329,  0.52016216])
 
>>>np.random.rand(2,4)    ##生成shape = (2,4) 的二维随机数组
Out[2]: 
array([[ 0.5644889 ,  0.10957407,  0.77592356,  0.21419645],
       [ 0.5584306 ,  0.70697347,  0.0706628 ,  0.45280476]])
  • numpy.random.randn(d1,d2,d3…dn):生成一个浮点数或N维浮点数组,取数范围:正态分布的随机样本数。
>>>import numpy as np
 
>>>np.random.randn(10)    #生成shape = 10的、满足正态分布的一维随机数组
Out[1]: 
array([-2.68867714,  1.30553568, -1.89705101,  0.22017578,  0.17460159,
       -0.4780114 ,  0.43347645,  0.18678857,  0.31898526, -0.07099354])
 
>>>np.random.randn(2,4)    #生成shape = (2,4)的、满足正态分布的二维随机数组
Out[2]: 
array([[ 0.1996084 ,  0.0290392 ,  1.21453716,  0.27951229],
       [ 0.91439426,  0.37279807,  0.02867786,  0.31190854]])
  • numpy.random.randint(low, high, size):返回随机的整数,位于半开区间 [low, high)。
>>>import numpy as np
 
>>>np.random.randint(10, size=10)  #生成一个位于半闭区间[0,10)内的size = 10一维随机整数数组
Out[1]: array([8, 0, 8, 4, 4, 0, 2, 0, 3, 2])
 
>>>np.random.randint(10, size=(2,5))  #生成一个位于半闭区间[0,10)内的size = (2,5)二维随机整数数组
Out[2]: 
array([[4, 8, 9, 1, 7],
       [5, 2, 2, 9, 1]])
 
>>>np.random.randint(0, 5, size=(2,5))  #生成一个位于半闭区间[0,5)内的size = (2,5)二维随机整数数组
Out[3]: 
array([[3, 4, 1, 2, 0],
       [3, 0, 1, 2, 1]])
  • numpy.random.standard_normal(size=None):生产一个浮点数或N维浮点数组,取数范围:标准正态分布随机样本。
>>>import numpy as np
 
>>>np.random.standard_normal(10)   #生成shape = 10的、满足标准正态分布的一维随机数组
Out[1]: 
array([-1.22636697, -1.23204532,  1.53296935, -0.43775173, -0.92269813,
       -0.58454018, -0.02354275,  1.01765777, -0.2336743 ,  0.80389956])
 
>>>np.random.standard_normal((2,4))  #生成shape = (2,4)的、满足标准正态分布的二维随机数组
Out[2]: 
array([[-0.51991048, -1.26169166,  0.2132792 ,  0.23725484],
       [ 1.23004584,  0.90366112, -0.11723758,  0.32600119]])
  • numpy.random.choice( a, size=None, replace=True, p=None ):从序列中获取元素,若a为整数,元素取值为np.range(a)中随机数;若a为数组,取值为a数组元素中随机元素。
>>>import numpy as np
 
>>>np.random.choice(2)   #生成一个range(2)中的随机数
Out[2]: 1
 
>>>np.random.choice(2,2)   #生成一个shape = 2 一维数组
Out[3]: array([1, 1])
 
>>>np.random.choice(5,(2,3))   #生成一个shape = (2,3) 二维数组
Out[4]: array([[4, 1, 1],
               [2, 4, 4]])
 
np.random.choice(np.array(['a','b','c','f'])) #生成一个np.array(['a','b','c','f']中随机元素
Out[5]: 'f'
 
np.random.choice(5, p=[0,0,0,0,1])  #以p的概率来生成随机数,生成的始终是4
Out[6]: 4
 
np.random.choice(5,3,p=[0,0.5,0.5,0,0])  #生成shape = 3的一维数组,元素取值为1或2的随机数
Out[7]: array([2, 2, 2], dtype=int64)

2.2 排序操作

  • numpy.random.shuffle ( x ):现场修改序列,改变自身内容。(类似洗牌,打乱顺序)
>>>import numpy as np
 
>>>A = np.arange(10)
>>>print(A)
[0 1 2 3 4 5 6 7 8 9]
 
>>>np.random.shuffle(A)
>>>print(A)
[3 0 7 4 9 5 2 1 6 8]
 
>>>B = np.arange(9).reshape((3, 3))
>>>print(B)
Out[1]: array([[0, 1, 2],
               [3, 4, 5],
               [6, 7, 8]])
 
>>>np.random.shuffle(B)
>>>print(B)
Out[11]: array([[6, 7, 8],
                [0, 1, 2],
                [3, 4, 5]])
  • numpy.random.permutation ( x ):返回一个随机排列
>>>import numpy as np
 
>>>np.random.permutation(10)
Out[1]: array([7, 9, 5, 0, 3, 6, 1, 4, 8, 2])
 
>>>np.random.permutation([1, 4, 9, 12, 15])
Out[2]: array([ 1,  9, 15, 12,  4])
 
>>>A = np.arange(9).reshape((3, 3))
>>>print(A)
Out[3]: array([[0, 1, 2],
               [3, 4, 5],
               [6, 7, 8]])
 
>>>np.random.permutation(A)
Out[4]: array([[0, 1, 2],
               [6, 7, 8],
               [3, 4, 5]])

2.3 随机数生成器

  • numpy.random.RandomState():指定种子值是为了使同样的条件下每次产生的随机数一样,避免程序调试时由随机数不同而引起的问题。
>>>import numpy as np
 
>>>np.random.RandomState(2018).randn(2,3)  #第一次产生(2,3)的数组
Out[3]: 
array([[-0.2767676 ,  0.581851  ,  2.14839926],
       [-1.279487  ,  0.50227689,  0.8560293 ]])
 
>>>np.random.RandomState(2018).randn(2,3)   #第二次产生(2,3)的数组
Out[4]: 
array([[-0.2767676 ,  0.581851  ,  2.14839926],
       [-1.279487  ,  0.50227689,  0.8560293 ]])
 
>>>np.random.randn(2,3)   #不指定种子数,第一次产生(2,3)的数组
Out[5]: 
array([[-0.23270408, -0.94468073, -1.2362389 ],
       [ 0.1987348 ,  0.78362735,  0.86252443]])
 
>>>np.random.randn(2,3)    #不指定种子数,第二次产生(2,3)的数组
Out[6]: 
array([[-2.14304926,  0.06838721,  1.0947292 ],
       [-0.59087582,  0.4183132 , -0.63660259]])
  • numpy.random.seed ( ):用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed( )值,则每次生成的随即数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。

>>>import numpy as np
 
>>>np.random.seed(2018)
>>>np.random.randn(2,3)    #使用seed时,第一次产生(2,3)的随机数组
Out[1]: 
array([[-0.2767676 ,  0.581851  ,  2.14839926],
       [-1.279487  ,  0.50227689,  0.8560293 ]])
 
>>>np.random.seed(2018)
>>>np.random.randn(2,3)    #使用seed时,第二次产生(2,3)的随机数组
Out[2]: 
array([[-0.2767676 ,  0.581851  ,  2.14839926],
       [-1.279487  ,  0.50227689,  0.8560293 ]])
 
>>>np.random.randn(2,3)    #不使用seed时,第一次产生(2,3)的随机数组
Out[3]: 
array([[-0.14279008,  0.11007867, -0.68806479],
       [ 0.43356408,  0.510221  , -0.16513097]])
 
>>>np.random.randn(2,3)    #使用seed时,第一次产生(2,3)的随机数组
Out[4]: 
array([[-1.35177905,  0.54663075,  1.23065512],
       [ 1.0764461 , -1.21062488, -0.30667657]])

参考:

https://blog.csdn.net/ywx1832990/article/details/81455042
https://www.cnblogs.com/twilight77/p/7675512.html
https://www.cnblogs.com/gl1573/p/11043886.html

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值