考虑下面一道试题:
import random
y=[i for i in range(10)]
random.seed(0)
#下面用一行代码实现选取y中的一个元素
z=______
print(z)
此题考察对random.seed()方法的理解。
如果不加考虑直接填充空行为:
z=random.choice(y)
每次执行的结果都是:
6
如果想每次执行的结果不同应该怎么办呢?
网上有文章说第一次执行random.choice()是确定值,后面就恢复随机性了,真的如此吗?把空行改为:
z=[random.choice(y) for i in range(10)]
可以发现每次执行后的z都是:
[6, 6, 0, 4, 8, 7, 6, 4, 7, 5]
这说明执行random.seed(0) 后,random.choice()不再能随机选取y中的一个元素了,其它方法也失去了随机性,比如把空行改为:
z=random.sample(y,3)
可以发现每次执行后的结果都是:
[6, 9, 0]
把空行改为:
z =[random.random() for i in range(5)]
每次执行后的结果都是:
[0.8444218515250481, 0.7579544029403025, 0.420571580830845, 0.25891675029296335, 0.5112747213686085]
还是要回到random.seed()方法,要再执行一次random.seed(),
让random模块恢复随机性,这样就可以真正随机选取y中一个元素了,
如何在一行代码中完成这个功能呢?
使用带条件过滤的列表推导式可以完成,即
z=[random.choice(y) for i in range(1) if random.seed()==None][0]
这样就做到了每次执行后的z都不同。