题目链接:384. 打乱数组
值得一提的是,经典的洗牌法,可以随机打乱一个数组。基本思路为,在一个有序列表中,随机选取元素前的另一个元素,与其本身交换,或者不交换。这样数组中所有元素在每个位置出现的概率相同。
from copy import copy
from math import floor
from typing import List
from random import Random
class Solution:
def __init__(self, nums: List[int]):
self.random = Random(0)
self.data = nums
def reset(self) -> List[int]:
# self.random.seed(0)
return copy(self.data)
def shuffle(self) -> List[int]:
data = copy(self.data)
for i in reversed(range(1, len(data))):
# pick an element in x[:i+1] with which to exchange x[i]
j = floor(self.random.random() * (i + 1))
data[i], data[j] = data[j], data[i]
return data