2016-08-10 5 views
0

У меня есть список a=[num1,num2,...,numn]. Я перетасовываю его random.shuffle(a). Однако то, что я хочу как функциональность, - это алгоритм тасования, который следует принимать в качестве входного ключа, а владелец ключа детерминистически производит одинаковые перетасовки?Keyed Random Shuffles in Python

Мне нужен алгоритм, который принимает в качестве входных данных ключ, последовательность элементов, которые нужно перетасовать, и выводит их случайную перестановку в зависимости от ключа. Если вы снова применяете тасование с вводом того же ключа в той же последовательности данных, вы получаете тот же результат. В противном случае случайная перетасовка. Одна и та же клавиша по тем же данным позволяет «un-shuffle»

Возможно ли это?

+1

Что такое 'владелец ключа'? Что вы подразумеваете под «детерминистически производят одни и те же перетасовки»? –

+0

Значит, вам нужен случайный случайный случай? Это то, о чем вы спрашиваете? –

+0

@ Two-BitAlchemist. Мне нужен алгоритм, который принимает в качестве входных данных ключ, последовательность элементов, которые нужно перетасовать, и выдает произвольную перестановку в зависимости от ключа. Если вы снова применяете тасование с вводом того же ключа в той же последовательности данных, вы получаете тот же результат. В противном случае случайная перетасовка. Один и тот же ключ по тем же данным позволяет «un-shuffle» – curious

ответ

2

В псевдослучайной терминологии, что ключ называется семян, и вы можете установить случайное зерно на новом random.Random() Например:

def keyed_shuffle(x, seed=None): 
    random_obj = random.Random(seed) 
    random_obj.shuffle(x) 

Вы можете использовать random.seed() и random.shuffle() непосредственно тоже, но с использованием ваш собственный экземпляр random.Random() избегает установки семени на одноэлементном random.Random() экземпляре, который использует модуль random, что не влияет на другие применения этого модуля.

Семя может быть целым числом (используется непосредственно) или любым хешируемым объектом.

Демо:

>>> a = [10, 50, 42, 193, 21, 88] 
>>> keyed_shuffle(a)  # no seed 
>>> a 
[42, 10, 88, 21, 50, 193] 
>>> a = [10, 50, 42, 193, 21, 88] 
>>> keyed_shuffle(a)  # again no seed, different random result 
>>> a 
[88, 50, 193, 10, 42, 21] 
>>> b = [10, 50, 42, 193, 21, 88] 
>>> keyed_shuffle(b, 42) # specific seed 
>>> b 
[193, 50, 42, 21, 10, 88] 
>>> b = [10, 50, 42, 193, 21, 88] 
>>> keyed_shuffle(b, 42) # same seed used, same output 
>>> b 
[193, 50, 42, 21, 10, 88] 
>>> c = [10, 50, 42, 193, 21, 88] 
>>> keyed_shuffle(b, 81) # different seed, different random order 
>>> c 
[10, 50, 88, 42, 193, 21] 

 Смежные вопросы

  • Нет связанных вопросов^_^