, 나는 당신이 찾고있는 생각 "어떻게 무작위로 미터에서 가능한 번호를 N 번호를 선택합니까?"
즉, 사용 가능한 숫자가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
이고 4를 선택하려는 경우 가능한 결과는 [8, 3, 5, 1]
입니다.
몇 가지 방법이 있습니다. 가장 간단한 방법 중 하나는 초기 목록을 무작위 순서로 놓고 상단을 가져 오는 것입니다. n 요소. 파이썬에서 예를 들어
, 당신이 정말로 필요하지 않은 경우가 전체 목록을 무작위 때문에
>>> available = range(10)
>>> random.shuffle(available)
>>> available[:4]
[5, 8, 6, 9]
이 알고리즘은, 약간의 낭비입니다.
개선 사항은 한 번에 한 요소 씩 그 요소 다음에 임의의 위치로 교체하는 것입니다. 이를 Fisher-Yates shuffle이라고합니다. 그것은 의사 코드에 다음과 같습니다
이
-- To shuffle an array a of n elements (indices 0..n-1):
for i from 0 to n−2 do
j ← random integer such that i ≤ j < n
exchange a[i] and a[j]
하지만 그 대신 전체 목록을 거치지 만 N 당신이 선택해야하는 항목의 수이고, N 깊은 이동합니다.
import random
def sample(items, how_many):
# copy the list
items = list(items)
# just do the first how_many items
for i in range(how_many):
random_index = random.randrange(i, len(items))
# swap the items
items[i], items[random_index] = items[random_index], items[i]
# return the first how_many
return items[:how_many]
print(sample(range(10), 4))
많은 언어/라이브러리가이 작업을 수행 할 수있는 기본 방법이 :
여기 파이썬 구현입니다.
>>> random.sample(range(10), 4)
[1, 5, 0, 4]
고유해야 할 경우 임의이어서는 안됩니다. 당신은 처음부터 하나의 제약 조건을 넣었습니다. –
물론 가능 합니다만, 그것은 매우 쉬운 알고리즘입니다. 이미 생성 된 숫자를 기억하고 새로운 것을 생성 할 때 이전에 생성되었는지 확인하십시오. 그렇다면 고유 한 것까지 새 것을 생성하고 확인하십시오. 그런 사소한 알고리즘에 문제가있는 곳은 어디입니까? –
몇 개의 고유 번호를 만드십니까? – chungtinhlakho