2016-08-10 3 views
0

) 목록이 a=[num1,num2,...,numn]입니다. 나는 그것을 random.shuffle(a)와 걸어 가고있다. 그러나 내가 원하는 기능은 입력을 키로 사용하고 키의 소유자가 결정적으로 동일한 셔플을 생성하는 셔플 알고리즘입니다.키가있는 무작위 셔플 (Python

키를 입력으로 사용하는 알고리즘을 원한다. 키에 따라 임의의 순열을 출력한다. 동일한 데이터 시퀀스에서 동일한 키를 입력하여 셔플을 다시 적용하면 동일한 결과를 얻게됩니다. 그렇지 않으면 무작위 셔플. 동일한 데이터의 동일한 키를 사용하여 "임의로 분리"할 수 있습니다.

그럴 수 있습니까?

의사 난수 용어에서
+1

에 '키의 소유자가'무엇입니까? '결정적으로 동일한 셔플을 생산'한다는 것은 무엇을 의미합니까? –

+0

그래서 무작위가 아닌 랜덤을 원하십니까? 네가 묻고있는거야? –

+0

@ 2-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]