python中在指定概率分布的情况下,为什么设定随机数种子仍影响random.choice的结果?运行结果是符合p分布的
for循环改成1000次试试 , 3、2、0出现的次数分别是587、299、114次,符合0.6、0.3、0.1
import numpy as np
i3 = i2 = i0 = 0
for seed in np.arange(1000):
np.random.seed(seed)
n = np.random.choice(5,p=[0.1, 0, 0.3, 0.6, 0])
i3 += n==3
i2 += n==2
i0 += n==0
print(i3, i2, i0)
随机种子确实影响结果
但不是影响结果的分布情况,而是影响计算机产生随机数的情况,你运行1000次结果一定和我一样,就是因为我们的随机种子给的都是一样的 。
随机种子
我们知道计算机无法产生真正的随机数,是通过算法产生的伪随机数,但具有类似于真正随机数的统计特征 , 如均匀性、独立性等 。
随机种子的作用在于给定这个产生随机数算法的初值 。给定后会影响以后产生随机数的具体值是多少,但不影响这些随机数的分布情况 。
上面那个程序,如果我们不指定随机种子,那么结果符合p分布,但你与我结果不同 , 同一段代码多次运行结果也不同 。如果指定随机种子,那么结果依然符合p分布 , 但全天下人运行结果都相同 。
如果已知两粒种子(随机种子)和两个生长环境(产生随机数算法)都完完全全一样 , 那么可以得出长出的两个作物完全一样(忽略量子力学影响) 。但这两粒种子无论相同与否都不会影响长出的作物到底是玉米还是高粱(不影响结果分布情况) 。
python为何规定了种子数,每次还是能产生不同的随机半径?这是因为,每次生成随机数后,它都会自动设置新的种子 。
开始 , 你设置了 random.seed(1),设由这个种子 1 产生的第一个随机数是 x,
然后 Python 会自动把现在的种子设为 x , 然后你第二次生成随机数的时候,使用的种子是 x 而不是 1 。
所以,如果你想每次都生成同样的半径 , 那只需要采取下面两个措施之一就可以了:
在 for 循环开始之前先生成随机的半径,然后保存到一个变量里 , 使用的时候调用这个变量;(推荐)
在每次调用之前都调用 random.seed(1) 。即在 for 循环的循环体开头处插入 random.seed(1) 。
祝你刷题顺利!
【Python 】性能优化系列:随机数最近在做的项目重点部分与大量生成随机数有关 , 维度高达[1700000,10000],需要生成 10 x 30 次左右,这里遇到内存和速度的双重瓶颈,特地研究了一下如何优化随机数 。
优化时间测试所需的分析工具在另一篇博客《性能优化系列一:分析工具》中提到 。
原生的python中也有随机模块生成 random.randint 和 random.random 等,但是速度非常慢,numpy 速度可以大幅提升 。一般都采用numpy生成随机数 。
比较常用的就是以上几种 。在需要生成大量随机数的情况下,或生成伪随机数的情况下,python 3.7 常用RandomState。
直接生成大规模非稀疏矩阵如下,经常遇到 MemoryError 的错误,大概是同时生成多个float64精度的大规模随机矩阵服务器内存不够,而random state 似乎也没提供调整类型的attr,
这时最好使用即使生成即使销毁,仅保留种子作为索引,同样,多个CPU之间共享大规模矩阵涉及到共享内存或数据传输同步较慢的问题,最好也共享seed而不是直接共享矩阵 。
ps. 这里注意一般我们设置time.time()为种子时 , 对于并发性程序是无效的,不要在并发程序中同时定义,建议生成一个seed list 列表再从中取 。
这里可以对大规模矩阵进行分片以进行后续的np 乘法,再切片赋值 , 以时间换内存 。这种情况的麻烦在于如果设定随机数种子会导致每个分片的随机数相同 。可以利用一个最初seed(爷爷种子)randint生成 一组切片组数的seed(父亲种子),再每次从中取不同的随机数 。
推荐阅读
- 电脑b站语音直播,电脑b站语音直播没声音
- 暗影精灵5显卡怎么插驱动,暗影精灵5怎么重装显卡驱动
- 虚拟机进入启动项失败,虚拟机启动失败怎么办
- 设备轻量化直播,视频轻量化设备
- 上海go语言职位 上海有专门的语言学校
- asp.netmvp模式demo,aspnet mvc运行流程
- 如何做新媒体矩阵搭建,新媒体矩阵怎么做
- c语言函数的基本元素 c语言主要函数
- c语言宏定义中的分号,宏定义是以分号结束的吗