Python中random函数用法整理(转载参考:https://blog.csdn.net/m0_62735081/article/details/124978101)

1. random.random(): 返回随机生成的一个浮点数,范围在[0,1)之间

2. random.uniform(a, b): 返回随机生成的一个浮点数,范围在[a, b)之间

在指定范围内生成随机数,有两个参数,一个是范围上限,一个范围下限

具体用法如下:

import random
print(random.uniform(2,6))
print(random.uniform(0,1))
print(random.uniform(-5,-3))

>>

3.532547940541432
0.6155873535382158
-3.6189487774790514

3. random.randint(a,b):生成指定范围内的整数,同样具有连两个参数,一个范围上限,一个范围下限。具体用法如random.uniform(a,b)

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

在指定范围内,按指定基数递增的集合中获取一个随机数,共有三个参数,前两个参数表示范围上限和范围下限,第三个参数表示递增增量大小。

具体用法如下:

import random
print(random.randrange(2,20,5))
print(random.randrange(2,20,5))
print(random.randrange(2,20,5))
>>

7
12
7

5. random.choice():从指定的序列中获取一个随机元素

6. random.shuffle(x[,random]):用于将一个列表中的元素打乱,随机排序

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

有两个参数:第一个参数表示指定序列,第二个参数表示需要获取的片段长度。

具体用法如下:


import random
array = [2,3,4,5,6,7,8,9]

a = random.sample(array, 5)
print(a)
print(array)

>>

[5, 8, 2, 3, 4]
[2, 3, 4, 5, 6, 7, 8, 9]

 

8. np.random.rand(d0, d1, …, dn): 返回一个或一组浮点数,范围在[0, 1)之间

9. np.random.normal(loc=a, scale=b, size=()): 返回满足条件为均值=a, 标准差=b的正态分布(高斯分布)的概率密度随机数

10 np.random.randn(d0, d1, … dn): 返回标准正态分布(均值=0,标准差=1)的概率密度随机数

11. np.random.standard_normal(size=()): 返回标准正态分布(均值=0,标准差=1)的概率密度随机数

12. np.random.randint(a, b, size=(), dtype=int): 返回在范围在[a, b)中的随机整数(含有重复值)

13. random.seed(): 设定随机种子

 涉及概念:

(1)、随机数
在百度百科中对随机数的定义为:
真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等,这样的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求比较高。
根据定义可以看到,真随机数是依赖于物理随机数生成器的。使用较多的就是电子元件中的噪音等较为高级、复杂的物理过程来生成。使用物理性随机数发生器生成的真随机数,可以说是完美再现了生活中的真正的“随机”,也可以称为绝对的公平。

(2)伪随机数
在百度百科中对伪随机数的定义为:
真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的。而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的。我们可以这样认为这个可预见的结果其出现的概率是100%。所以用计算机随机函数所产生的“随机数”并不随机,是伪随机数。
从定义我们可以了解到,伪随机数其实是有规律的。只不过这个规律周期比较长,但还是可以预测的。主要原因就是伪随机数是计算机使用算法模拟出来的,这个过程并不涉及到物理过程,所以自然不可能具有真随机数的特性。
(3)随机种子
计算机中产生的随机数是伪随机数,所谓的‘伪’,意思是这些数其实是有规律的,只不过因为算法规律太复杂,很难看出来而已。但是,再厉害的算法,如果没有一个初始值,它也不可能凭空造出一系列随机数来,我们说的种子就是这个初始值。
random随机数是这样生成的:我们将这套复杂的算法(是叫随机数生成器吧)看成一个黑盒,把我们准备好的种子扔进去,它会返给你两个东西,一个是你想要的随机数,另一个是保证能生成下一个随机数的新的种子,把新的种子放进黑盒,又得到一个新的随机数和一个新的种子,从此在生成随机数的路上越走越远。
————————————————
版权声明:本文为CSDN博主「一个新新的小白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31511955/article/details/110424334

使用numpy时,就会运用到随机种子,其代码模板为:

import random
random.seed(10)
print(random.random())

理解的困惑

 (1)利用随机种子后,每次生成的随机数相同。这是什么意思?
(2)随机数种子的参数怎么选择?在别人的代码中经常看到np.random.seed(Argument),这个参数不一样,有的是0,有的是1,当然还有其他数。那这个参数应该怎么选择呢?

我们利用如下代码进行测试:

import numpy as np
if __name__ == '__main__':
i = 0
while i < 6:
if i < 3:
np.random.seed(0)
print(np.random.randn(1, 5))
else:
print(np.random.randn(1, 5))
i += 1
i = 0
while i < 2:
print(np.random.randn(1, 5))
i += 1
print(np.random.randn(2, 5))
np.random.seed(0)
print("###################################")
i = 0
while i < 8:
print(np.random.randn(1,5))
i += 1

 

通过该实验我们可以得到以下结论:

两次利用随机数种子后,即便是跳出循环后,生成随机数的结果依然是相同的。第一次跳出while循环后,进入第二个while循环,得到的两个随机数组确实和加了随机数种子不一样。但是,后面的加了随机数种子的,八次循环中的结果和前面的结果是一样的。说明,随机数种子对后面的结果一直有影响。同时,加了随机数种子以后,后面的随机数组都是按一定的顺序生成的。
在同样的随机种子后第六次的随机数生成结果,两行五列的数组和两个一行五列的数组结果相同。说明,在生成多行随机数组时,是由单行随机数组组合而成的。
利用随机数种子,每次生成的随机数相同,就是使后面的随机数按一定的顺序生成。当随机数种子参数为0和1时,生成的随机数和我上面高亮的结果相同。说明该参数指定了一个随机数生成的起始位置。每个参数对应一个位置。并且在该参数确定后,其后面的随机数的生成顺序也就确定了。
随机数种子的参数怎么选择?我认为随意,这个参数只是确定一下随机数的起始位置。

 

(4)深度学习中的随机种子
深度学习网络模型中初始的权值参数通常都是初始化成随机数,而使用梯度下降法最终得到的局部最优解对于初始位置点的选择很敏感。为了能够完全复现作者的开源深度学习代码,随机种子的选择能够减少一定程度上算法结果的随机性,也就是更接近于原始作者的结果
即产生随机种子意味着每次运行实验,产生的随机数都是相同的。但是在大多数情况下,即使设定了随机种子,仍然没有办法完全复现作者paper中所给出的模型性能,这是因为深度学习代码中除了产生随机数中带有随机性,其训练的过程中使用 mini-batch SGD或者优化算法进行训练时,本身就带有了随机性。因为每次更新都是从训练数据集中随机采样出batch size个训练样本计算的平均梯度,作为当前step对于网络权值的更新值,所以即使提供了原始代码和随机种子,想要
复现作者paper中的性能也是非常困难的。
————————————————
版权声明:本文为CSDN博主「一个新新的小白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31511955/article/details/110424334

 

 

首先我们需要导入random模块

1. random.random(): 返回随机生成的一个浮点数,范围在[0,1)之间
import random
print(random.random())


2. random.uniform(a, b): 返回随机生成的一个浮点数,范围在[a, b)之间
import random
print(random.uniform(1,5))


3. random.randint(a,b):生成指定范围内的整数
import random
print(random.randint(1,10))


4. 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)) 等效。

import random
print(random.randrange(10,22,3))


5. random.choice():从指定的序列中获取一个随机元素
random.choice()从序列中获取一个随机元素,其原型为random.choice(sequence),参数sequence表示一个有序类型。这里说明一下,sequence在Python中不是一种特定的类型,而是泛指序列数据结构。列表,元组,字符串都属于sequence。

import random
print(random.choice('学习python')) # 从字符串中随机取一个字符
print(random.choice(['good', 'hello', 'is', 'hi', 'boy'])) # 从list列表中随机取
print(random.choice(('str', 'tuple', 'list'))) # 从tuple元组中随机取


6. random.shuffle(x[,random]):用于将一个列表中的元素打乱,随机排序
import random
p=['hehe','xixi','heihei','haha','zhizhi','lala','momo..da']
random.shuffle(p)
print(p)
x = [1, 2, 3, 4, 5]
random.shuffle(x)
print(x)


7. random.sample(sequence,k):用于从指定序列中随机获取指定长度的片段,sample()函数不会修改原有序列。
import random
list1=[1,2,3,4,5,6,7,8,9,10]
slice=random.sample(list1,5)
print(slice)
#[8, 3, 5, 9, 10]
print(list1)
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
x = random.sample(range(0, 10), 5)
print(x, type(x))
#[9, 2, 7, 8, 6] <class 'list'>
Words = "AppleKMedoide"
print(random.sample(Words, 3))
#['p', 'M', 'A']
print(random.sample(Words, 3))
#['d', 'i', 'l']


下面的函数需要调用numpy库

8. np.random.rand(d0, d1, …, dn): 返回一个或一组浮点数,范围在[0, 1)之间
import random
import numpy as np
x = np.random.rand()
y = np.random.rand(4)
print(x,type(x))
#0.09842641570445387 <class 'float'>
print(y,type(y))
#[0.27298291 0.12350038 0.63977128 0.90791234] <class 'numpy.ndarray'>


9. np.random.normal(loc=a, scale=b, size=()): 返回满足条件为均值=a, 标准差=b的正态分布(高斯分布)的概率密度随机数
np.random.normal(loc=a, scale=b, size=()) - 返回满足条件为均值=a, 标准差=b的正态分布(高斯分布)的概率密度随机数,size默认为None(返回1个随机数),也可以为int或数组

import random
import numpy as np
x = np.random.normal(10,0.2,2)
print(x,type(x))
#[9.78391585 9.83981096] <class 'numpy.ndarray'>
y = np.random.normal(10,0.2)
print(y,type(y))
#9.871187751372984 <class 'float'>
z = np.random.normal(0,0.1,(2,3))
print(z,type(z))
#[[-0.07114831 -0.10258022 -0.12686863]
# [-0.08988384 -0.00647591 0.06990716]] <class 'numpy.ndarray'>
z = np.random.normal(0,0.1,[2,2])
print(z,type(z))
#[[ 0.07178268 -0.00226728]
# [ 0.06585013 -0.04385656]] <class 'numpy.ndarray'>


10 np.random.randn(d0, d1, … dn): 返回标准正态分布(均值=0,标准差=1)的概率密度随机数
np.random.randn(d0, d1, ... dn): 返回标准正态分布(均值=0,标准差=1)的概率密度随机数,

import random
import numpy as np
x = np.random.randn()
y = np.random.randn(3)
z = np.random.randn(3, 3)
print(x, type(x))
print(y, type(y))
print(z, type(z))


11. np.random.standard_normal(size=()): 返回标准正态分布(均值=0,标准差=1)的概率密度随机数
np.random.standard_normal(): 返回标准正态分布(均值=0,标准差=1)的概率密度随机数, size默认为None(返回1个随机数),也可以为int或数组

import random
import numpy as np
x = np.random.standard_normal()
y = np.random.standard_normal(size=(3,3))
print(x, type(x))
print(y, type(y))


np.random.rand()与np.random.standard_normal()的方法结果相似,都是返回合符标准正态分布的随机浮点数或数组。

12. np.random.randint(a, b, size=(), dtype=int): 返回在范围在[a, b)中的随机整数(含有重复值)
np.random.randint(a, b, sizie=(), dytpe=int) - size默认为None(返回1个随机数),也可以为int或数组

import random
import numpy as np
# 从序列[0, 10)之间返回shape=(5,5)的10个随机整数(包含重复值)
x = np.random.randint(0, 10, size=(5, 5))
# 从序列[15, 20)之间返回1个随机整数(size默认为None, 则返回1个随机整数)
y = np.random.randint(15, 20)
print(x, type(x))
print(y, type(y))


13. random.seed(): 设定随机种子
在设定随机种子为10之后,random.random()的随机数将被直接设定为:0.5714025946899135

import random
random.seed(10)
x = random.random()
print(x,type(x))
random.seed(10)
y = random.random()
print(y,type(y))
z = random.random()
print(z,type(z))


random随机数是这样生成的:我们将这套复杂的算法(是叫随机数生成器吧)看成一个黑盒,把我们准备好的种子扔进去,它会返给你两个东西,一个是你想要的随机数,另一个是保证能生成下一个随机数的新的种子,把新的种子放进黑盒,又得到一个新的随机数和一个新的种子,从此在生成随机数的路上越走越远。

 

————————————————
转载CSDN博主「西瓜芒果气泡水」的原创文章,原文链接:https://blog.csdn.net/m0_62735081/article/details/124978101

 

posted @ 2022-10-22 11:52  菜鸟&码农  阅读(1110)  评论(0编辑  收藏  举报