[PYTHON] Tous les éléments bougent (ne restent pas dans la même position) shuffle

Post-scriptum 8/25

version finale? ?? http://qiita.com/ttatsf/items/d4543ccc80e0fbe3891d#comment-3eccf9c112d73c505bc2

8/23 postscript

Il a été souligné que le programme suivant ne couvre pas tous les modèles de mélange. Un exemple d'échange étrange tel que [0,1,2,3] → [1,0,3,2]. Soyez prudent lorsque vous l'utilisez.

8/21 postscript

Il semble que c'est finalement devenu deux lignes (yeux blancs)

def shuffle_all_move(items):
    rand_ord = random.sample(range(len(items)), k=len(items))
    return [items[r] for i, r in sorted(zip(rand_ord, rand_ord[1:]+rand_ord[:1]))]

La vitesse d'exécution semble être légèrement plus rapide dans le code ci-dessus (les résultats de mesure sont affichés dans la section des commentaires).


Post-scriptum 8/19

J'aime celle faite par ttatsf dans la section commentaires. (7of9 a introduit "l'algorithme de Sattro" dans la base) Merci à tous ceux qui ont écrit le code dans les commentaires.

import random

def shuffle_all_move( items ):
  length = len( items )
  res = [ 0 ] * length
  rand_ord = random.sample( range( length ), k=length )
  for i in range(  length  ) :
    res[ rand_ord[ i ] ] = items[ rand_ord[ ( i + 1 ) % length ] ]
  return res

Vraiment élégant! Donc, je recommanderais d'utiliser ce qui précède à partir du mélange de bricolage approprié ci-dessous.


Message original

Il s'agit d'une implémentation python + numpy de shuffle qui déplace absolument les éléments (notez qu'il est supposé qu'il y a 3 éléments ou plus dans le tableau). procédure

  1. Divisez au hasard l'élément en 3 groupes
  2. mélanger pour chaque groupe
  3. Faites glisser un groupe.

Le groupement aléatoire de 1 est en fait réalisé en mélangeant puis en divisant le tableau en trois. Même si vous faites glisser un groupe de tableaux mélangés, cela ne sera pas pertinent par rapport à la position du tableau d'origine, de sorte que ce mélange sera restauré plus tard. Cela garantit qu'il se déplacera toujours vers une position différente de la séquence d'origine.

Ce code emprunte le code des deux pages suivantes. ※ resettable_shuffle/reset_shuffle http://qiita.com/EafT/items/9527cb30409b70106fd4 ※ divide_list http://fits.hatenablog.com/entry/2015/11/09/211012

def shuffle_all_move(_array):
    array = _array.copy()
    seed = random.randint(0,np.iinfo(np.int32).max)
    resettable_shuffle(array,seed)
    array = divide_list(array,3)
    if type(array[0]) == list:
        array = array[-1] + array[0] + array[1]
    else:
        array = np.vstack((array[-1], array[0],array[1]))
    return reset_shuffle(array,seed)

Exemple d'exécution

test_array = ['a','b','c','d','e','f']
print(test_array)
test_array = shuffle_all_move(test_array)
print(test_array)

['a', 'b', 'c', 'd', 'e', 'f'] ['c', 'e', 'f', 'b', 'd', 'a']

Recommended Posts

Tous les éléments bougent (ne restent pas dans la même position) shuffle
Assurez-vous que tous les éléments de la liste sont les mêmes en Python
[Python] Combine tous les éléments dans un tableau
[Python] Affiche toutes les combinaisons d'éléments de la liste
Ne passez pas self à ProcessPoolExecutor en classe
Déterminer si tous les éléments de la liste sont présents dans la clé dict