アルゴリズムをシャッフル(高レナードスクランブルアルゴリズム)を記録

  • 原理:最後の番号の数と前回交換の数N-1は、最後から二番目の前の交換と番号N-2などの数。
    • 達成するためのアルゴリズムをシャッフルパイソン

      import random
      lst = list(range(10))
      for i in reversed(range(len(lst))):
          j = random.randint(0,i)
          lst[i],lst[j] = lst[j],lst[i]
      print(lst)
  • シャッフルアルゴリズムで使用するrandom.shuffle、ここに掲載のソースコード内のpython

        def shuffle(self, x, random=None):
            """Shuffle list x in place, and return None.
    
            Optional argument random is a 0-argument function returning a
            random float in [0.0, 1.0); if it is the default None, the
            standard random.random will be used.
    
            """
    
            if random is None:
                randbelow = self._randbelow
                for i in reversed(range(1, len(x))):
                    # pick an element in x[:i+1] with which to exchange x[i]
                    j = randbelow(i+1)
                    x[i], x[j] = x[j], x[i]
            else:
                _int = int
                for i in reversed(range(1, len(x))):
                    # pick an element in x[:i+1] with which to exchange x[i]
                    j = _int(random() * (i+1))
                    x[i], x[j] = x[j], x[i]
    
    
    
        def _randbelow(self, n, int=int, maxsize=1<<BPF, type=type,Method=_MethodType,BuiltinMethod=_BuiltinMethodType):
            "Return a random int in the range [0,n).  Raises ValueError if n==0."
    
            random = self.random
            getrandbits = self.getrandbits
            # Only call self.getrandbits if the original random() builtin method
            # has not been overridden or if a new getrandbits() was supplied.
            if type(random) is BuiltinMethod or type(getrandbits) is Method:
                k = n.bit_length()  # don't use (n-1) here because n can be 1
                r = getrandbits(k)          # 0 <= r < 2**k
                while r >= n:
                    r = getrandbits(k)
                return r
            # There's an overridden random() method but no new getrandbits() method,
            # so we can only use random() from here.
            if n >= maxsize:
                _warn("Underlying random() generator does not supply \n"
                    "enough bits to choose from a population range this large.\n"
                    "To remove the range limitation, add a getrandbits() method.")
                return int(random() * n)
            if n == 0:
                raise ValueError("Boundary cannot be zero")
            rem = maxsize % n
            limit = (maxsize - rem) / maxsize   # int(limit * maxsize) % n == 0
            r = random()
            while r >= limit:
                r = random()
            return int(r*maxsize) % n

おすすめ

転載: www.cnblogs.com/Yongzyw/p/11520238.html