Leetcode384. Mezcla aleatoriamente el algoritmo array-shuffle

384. Mezcla la matriz

Dificultad: media

Mezcla una matriz sin elementos duplicados.

Ejemplo:

// 以数字集合 1, 23 初始化数组。
int[] nums = {
    
    1,2,3};
Solution solution = new Solution(nums);

// 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。
solution.shuffle();

// 重设数组到它的初始状态[1,2,3]。
solution.reset();

// 随机返回数组[1,2,3]打乱后的结果。
solution.shuffle();

Solución

Solo hay una línea de algoritmo de barajado, inventado por Gonard, muy simple.
Sin embargo, el número aleatorio generado por la función rand () es un poco controvertido y puede que no sea uniforme. Aquí, rand () se considera imparcial.

Los números aleatorios (o eventos aleatorios) en el verdadero sentido se generan aleatoriamente durante un cierto proceso de generación de acuerdo con la probabilidad de distribución mostrada en el proceso experimental, y los resultados son impredecibles e invisibles. La función aleatoria en la computadora se simula de acuerdo con un cierto algoritmo, y el resultado es definido y visible. Podemos pensar que la probabilidad de este resultado previsible es del 100%. Por lo tanto, el "número aleatorio" generado por la función aleatoria de la computadora no es aleatorio, sino un número pseudoaleatorio.
El número pseudoaleatorio de una computadora es un valor calculado por una semilla aleatoria de acuerdo con un determinado método de cálculo. Por lo tanto, siempre que el método de cálculo sea cierto y la semilla aleatoria sea cierta, el número aleatorio generado es fijo.
Siempre que el usuario o un tercero no establezca la semilla aleatoria, la semilla aleatoria proviene del reloj del sistema de forma predeterminada.
La biblioteca de Python usa algoritmos generales en la parte inferior. Después de una prueba larga, no se puede decir la confiabilidad, pero no debe usarse para funciones relacionadas con contraseñas.

for i in range(len(L)-1,-1,-1):
	swap(L[i],L[rand(0,i)])//rand()产生[0,i]间的随机数,注意包括i

Solución (descubrí que la velocidad lenta del código puede deberse a muchas cosas de importación, y la biblioteca de copia está en la parte inferior, y la velocidad y la memoria son promedio después de la eliminación):

class Solution(object):

    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        self.nums=nums
        self.re=[i for i in nums]
        

    def reset(self):
        """
        Resets the array to its original configuration and return it.
        :rtype: List[int]
        """
        self.nums=[i for i in self.re]
        return self.nums

    def shuffle(self):
        """
        Returns a random shuffling of the array.
        :rtype: List[int]
        """
        nums=self.nums
        for i in range(len(nums)-1,-1,-1):
            a=random.randint(0,i)
            nums[i],nums[a]=nums[a],nums[i]
        return self.nums


# Your Solution object will be instantiated and called as such:
# obj = Solution(nums)
# param_1 = obj.reset()
# param_2 = obj.shuffle()

Supongo que te gusta

Origin blog.csdn.net/qq_45268474/article/details/108453314
Recomendado
Clasificación