2014-04-14 9 views
3

나는 random.seed()를 사용하여 random.sample()을 유지하고 목록에서 더 많은 값을 샘플링하고 어떤 시점에서 숫자가 변경됩니다. ... seed() 함수의 목적 중 하나가 숫자를 동일하게 유지하는 것이라고 생각한 곳입니다.동일한 시퀀스를 유지하지 않는 파이썬 시드()

Heres 나는 그것이 동일한 숫자를 유지하지 않는다는 것을 증명하기 위해 한 테스트입니다.

import random 

a=range(0,100) 
random.seed(1) 
a = random.sample(a,10) 
print a 

후 훨씬 더 높은 샘플을 변경하고 순서가 (적어도 나에게 그들은 항상) 변경됩니다 :

a = random.sample(a,40) 
print a 

내가 newb의 종류 해요 그래서 어쩌면이 쉽게 수정하지만, 나는 이것에 대한 도움을 주시면 감사하겠습니다. 감사합니다.

+0

당신이 (인쇄 A에서) 샘플 출력을 줄 수 당신이 기대하고 무엇을 얻고 무엇을위한 ? 귀하의 질문은 약간 막연합니다 (숫자가 바뀌 었습니까?)하지만이 기능이 예상대로 작동하는 것 같습니다. –

+0

무작위 표본의 서브 시퀀스는 무작위 표본 자체이기도합니다. 따라서, 여러분은 아마도 40 개 요소 샘플을 앞쪽으로 잡아서 10 개 요소를 하나의 조각으로 만들어야합니다. – Blckknght

+0

@PaulSeeb 예, 죄송합니다. 다소 모호했습니다. 반복 목표없이 무작위 순서로 0 샘플에서 전체 100 샘플로 이동하는 내 목표를 조금 더 설명해야합니다. 샘플 수가 증가함에 따라 시퀀스가 ​​어느 시점에서 변경됩니다.10으로 샘플을 만들 때 내 시퀀스는 [13,84,76,25 ...]로 시작하고 40을 가진 샘플은 [13,83,74,24 ...]로 표시되며 일부 숫자는 동일하게 유지됩니다. 어떤 점에서 다른 변경은 나에게 이상하게 보였다. – Motion4D

답변

4

, 어떤 일이 일어날 것은 당신이 기다리고있어 정확히 것입니다 : 당신이 볼 수 있듯이

In [1]: import random 

In [2]: random.seed(1) 

In [3]: [random.randint(0, 99) for _ in range(10)] 
Out[3]: [13, 84, 76, 25, 49, 44, 65, 78, 9, 2] 

In [4]: random.seed(1) 

In [5]: [random.randint(0, 99) for _ in range(40)] 
Out[5]: [13, 84, 76, 25, 49, 44, 65, 78, 9, 2, 83, 43 ...] 

은, 처음 10 개 번호가 실제로 동일합니다.

random.sample()대체품이 없으므로 그림이 그려지는 것은 사실입니다. 그 중 대체되는 것은입니다. 이러한 알고리즘의 작동 방식을 이해하려면 Reservoir Sampling을 참조하십시오. 본질적으로 어떤 일이 발생하는지는 나중에 샘플은 이전에 샘플을 결과 집합에서 밀어 낼 수 있습니다.

하나의 대안은 인덱스의 목록을 셔플 한 후 취할 수 있습니다 10 개 또는 40 첫 번째 요소 :

In [1]: import random 

In [2]: a = range(0,100) 

In [3]: random.shuffle(a) 

In [4]: a[:10] 
Out[4]: [48, 27, 28, 4, 67, 76, 98, 68, 35, 80] 

In [5]: a[:40] 
Out[5]: [48, 27, 28, 4, 67, 76, 98, 68, 35, 80, ...] 
+0

고마워, 난 괜찮아요 일한 귀하의 두 번째 옵션을 사용하지만, 그 바보가 random.sample 못해 모든 방법을 전환하지 않고 카운트. 첫 번째 옵션은 너무 반복적이었습니다. 도와 주셔서 다시 한번 감사드립니다 !! – Motion4D

3

은 샘플 크기가 일정하게 유지되는 경우에만 의 시드가있는 경우에만 결정적으로 보인다. 즉, 시드를 다시 설정하더라도 길이가 다른 샘플을 생성하는 것은 "동일한"임의 연산이 아니며 동일한 시드로 더 작은 샘플을 생성하는 것과는 다른 초기 하위 시퀀스를 제공 할 수 있습니다. 즉, 동일한 난수가 내부적으로 생성되지만, sample이 무작위 순서를 유도하는 데 사용하는 방법은 요청한 샘플의 크기에 따라 다릅니다.

def samples(lst, k): 
    n = len(lst) 
    indices = [] 
    while len(indices) < k: 
     index = random.randrange(n) 
     if index not in indices: 
      indices.append(index) 
    return [lst[i] for i in indices] 

제공 :

3

이 같은 random.sample 뭔가의 구현 가정합니다

>>> random.seed(1) 
>>> samples(list(range(20)), 5) 
[4, 18, 2, 8, 3] 
>>> random.seed(1) 
>>> samples(list(range(20)), 10) 
[4, 18, 2, 8, 3, 15, 14, 12, 6, 0] 

그러나,이 random.sample이 실제로 구현되는 방법되지 않습니다; seed 당신이 생각하는대로 작동합니까, 그렇지 않다면 sample입니다! 당신이 발전기에서 독립적 인 샘플을 그릴 수 있다면