2013-07-28 3 views
3

저는 파이썬이 특정 숫자 이외의 난수를 어떻게 생성하는지 궁금합니다. 예를 들어 3을 제외하고 1에서 5까지의 숫자를 생성하려면 출력이 1,2,4이고 목록에서 계산되지 않습니다. 어떻게해야합니까? 고마워요.파이썬의 특정 숫자를 제외하고 임의의 정수를 선택 하시겠습니까?

예를 들어 의 5 명이 있고 플레이어 1-4가 컴퓨터 화되어있는 게임에있는 예가 될 것입니다. 동일한 것을하기 위해 다른 플레이어 (자신 이외의 플레이어)와 플레이어 2-4를 무작위로 선택하려면 플레이어 1이 필요합니다.

그래서 출력은 다음과 같을 것이다 :

player 1 who do you want to play with? 
player 1 chooses player 2 
+0

이것은 [XY 문제] 같은 소리 (HTTP ://meta.stackexchange.com/questions/66377/what-is-the-xy-problem); 여기에 해결하려는 문제를 포함하고 인식 된 해결책에 대한 상세한 비트를 얻는 방법은 포함시키지 마십시오. –

답변

5

목록에 대한 사용 random.choice하지만, 첫 번째 목록에서 특정 번호를 제거합니다

>>> import random 
>>> n = 3 
>>> end = 5 
>>> r = range(1,n) + range(n+1, end) 
>>> r 
[1, 2, 4] 
>>> random.choice(r) 
2 
>>> random.choice(r) 
4 

을 또는 함수 정의 :

def func(n, end, start = 1): 
    return range(start, n) + range(n+1, end) 
... 
>>> r = func(3, 5) 
>>> r 
[1, 2, 4] 
>>> random.choice(r) 
2 

업데이트 :

이 목록에서 특정 번호를 제외한 모든 번호를 반환 : 당신은 숫자의 임의 세트를 생성 할 것처럼

>>> r = range(5) 
for player in r: 
    others = range(0, player) + range(player+1, 5) 
    print player,'-->', others 
...  
0 --> [1, 2, 3, 4] 
1 --> [0, 2, 3, 4] 
2 --> [0, 1, 3, 4] 
3 --> [0, 1, 2, 4] 
4 --> [0, 1, 2, 3] 
+2

또는 'x [x in xrange (1, 5) if x! = 3]' –

+0

전환하려면 어떻게해야합니까? 이제 3 명이 제거되기를 바란다. 그리고 나중에 1이나 2와 같은 다른 번호가 필요합니다. 나는 동일한 def func을 사용할 수 있습니까? 아니면 새로 생성해야합니까? – user2626540

+0

@ user2626540 : 무엇을하려고합니까? –

3

그런 다음 그 하나씩에서 선택, 소리가 난다. 반복하지 않고 무작위 순서, 즉.

는 모든 숫자, 셔플, 다음 한 번에 하나를 선택과 가능성의 세트에서 제거 .pop()을 사용하여 생성 :

import random 

numbers = range(5) # list(range(5)) in Python 3 
random.shuffle(numbers) 

a_random_number = numbers.pop() 
another_random_number = numbers.pop() 

list.pop() 무작위로 단행 번호 목록에서 마지막 값을 제거합니다.

그것도 단지 셔플 충분히하고 목록을 통해 다음 루프 수 있습니다 :

players = range(5) 
random.shuffle(players) 

for player in players: 
    # random ordering of players 

당신은 함수에서 반복자로 난수 시퀀스 생산을 묶을 수 있습니다

import random 

def random_number_sequence(n): 
    numbers = range(n) # list(range(n)) in Python 3 
    random.shuffle(numbers) 
    return iter(numbers) 

random_sequence = random_number_sequence(5) 
a_random_number = next(numbers) 
another_random_number = next(numbers) 

반복자에서 next()을 호출하면 시퀀스가 ​​고갈 될 때까지 (StopIteration이 반환 될 때까지) 시퀀스에서 다른 난수가 생성됩니다.

+0

안녕 난 임의의 숫자를 생성하려고하지 오전. 나는 이미 0-5 (0-5 플레이어)이고 다른 플레이어 (0-5)를 무작위로 선택하기 위해 플레이어 1이 필요하다. 정말 고맙습니다! – user2626540

0

이 경우 random.choice은 정상적으로 작동하지만 분명히 간단한 수학적 변환이 가능합니다. 플레이어가 0에서 5까지 번호가 매겨졌고 플레이어 X 인 경우 :

number = random.choice(0, 4) # first, pick a number: 0, 1, 2, 3, or 4 
if number >= X:    # then, if it's me or higher... 
    number += 1    # move forward one player 

당신이 어떤 플레이어 번호를 사용하든 관계없이 작동한다는 점에 유의하십시오. # 5 인 경우이 숫자는 0과 4 사이의 숫자를 선택합니다. 이는 # 5이므로 사용자가 아닙니다. # 0 인 경우 0과 4 사이의 숫자를 선택합니다. # = 0이므로 1을 추가하여 1과 5 사이의 숫자를 부여합니다. # 3이면 숫자가 0, 4, 3 또는 4라면 1에서 4 또는 5까지 올립니다.

수정하기 :이 옵션을 선택하면 "공정한"교대로 (누군가가 다시 돌아 오기 전에 모든 사람들이 차례를 얻음) 할 수 없습니다. 원하는 경우 목록을 생성하고 random.shuffle을 사용하여 임의의 순서로 입력 한 다음 목록에서 빈 (.pop() 또는 그와 비슷한)을 선택하면됩니다. 그런 다음 새로운 (그러나 다른) 공정한 순서로 목록을 다시 채우고 다시 섞을 수 있습니다.

(가 중요한 이유 "어떻게 거기에 도착하는 방법"에 대해 전에 당신이 원하는을 알아 내기 위해 이런 종류의 일이 있습니다.)

+0

그건 일정하지 않습니다 - 5 인의 플레이어를 예로 들어 봅시다. 플레이어 1이고 주사위를 굴릴 때 플레이어 2는 다른 플레이어보다 두 배 더 확률이 높습니다. –

+0

@JakubM : 그것은 분명하지 않습니다 그가 여기 어떤 종류의 공정성을 원 하든지. 하지만 아니요, 2 번 선수는 추가 확률이 없습니다. 우리는 * 하나 적은 * 숫자를 선택하고 모두를 "나"다음으로 이동시킵니다. – torek

+0

만약 그가하지 않았다면, 그는 무작위 숫자를 사용하지 않을 것입니다. :) 그렇습니다. 명시 적으로 말해야합니다. 어쩌면 OP는 그가 선택이 공정하기를 바란다는 것을 아직 모른다. –

관련 문제