##非控制随机种子列表随机洗牌
特点:
- 随机的产生一个随机数
p
,当做列表lis
的索引位置,随机数产生范围为列表长度范围(len(lis))
内 - 取出当前索引
p
位置的元素,依次向后放置于新列表new_lis
中,之后删除掉原列表中对应位置元素 - 循环,直至全部取出、
此种洗牌方式,是最为直观的洗牌方式,随机的从原列表中抽出一张牌,生成一个新的排列
import random
def glyz_shuffle(lis):
new_lis = []
while lis:
p = random.randrange(0, len(lis))
new_lis.append(lis[p])
lis.pop(p)
return new_lis
lis = glyz_shuffle([1,2,3,4,5,4,3,2,1])
print(lis)
可以使用pop()
方法来对列表中的元素进行删除,也可以使用全局函数del
来删除指定位置
没有添加随机种子的随机排序,将会存在不可控排序,即每次执行的结果都是随机的。
再次执行程序,重排结果将不同:
##使用随机种子控制伪随机列表洗牌
import random
def glyz_shuffle(lis):
new_lis = []
randseed = 3
random.seed(randseed)
while lis:
p = random.randrange(0, len(lis))
new_lis.append(lis[p])
lis.pop(p)
return new_lis
lis = glyz_shuffle([1,2,3,4,5,4,3,2,1])
print(lis)
每次执行的重排结果将相同。
如果想增加洗牌的随机性,可将每一次得到的最后一个随机数当做下次洗牌的随机种子。
def glyz_shuffle(lis,randseed):
new_lis = []
return_p = 0
return_all = []
random.seed(randseed)
while lis:
p = random.randrange(0, len(lis))
new_lis.append(lis[p])
lis.pop(p)
return_p = p
return_all.append(new_lis)
return_all.append(return_p)
return return_all
randseed = 3
for i in range(2):
lis = glyz_shuffle([1,2,3,4,5,4,3,2,1],randseed)
randseed = lis[1]
print(lis)