384. 打乱数组

exiaohu 于 2021-11-22 发布

题目链接: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