복붙노트

[PYTHON] 범위 내에서 'n'개의 고유 난수 생성 [duplicate]

PYTHON

범위 내에서 'n'개의 고유 난수 생성 [duplicate]

나는 파이썬에서 범위 내에서 난수를 생성하는 법을 안다.

random.randint(numLow, numHigh)

그리고이 숫자를 n 개의 루프로 생성 할 수 있음을 알고 있습니다.

for x in range (0, n):
    listOfNumbers.append(random.randint(numLow, numHigh))

그러나 해당 목록의 각 번호가 고유해야합니다. 조건문이로드되는 것 외에 n 개의 고유 난수를 생성하는 간단한 방법이 있습니까?

편집 : 중요한 것은 목록의 각 번호가 다른 것입니다 다른 ..

그래서

[12, 5, 6, 1] = 좋은

그러나

[12, 5, 5, 1] ​​= 5 번이 두 번 나타나기 때문에 나쁘다.

해결법

  1. ==============================

    1.대체없이 샘플링 만하면됩니다.

    대체없이 샘플링 만하면됩니다.

    >>> import random
    >>> random.sample(range(1, 100), 3)
    [77, 52, 45]
    

    random.sample은 모집단과 표본 크기 k를 취하여 모집단의 k 개의 임의 구성원을 반환합니다.

    k가 len (population)보다 큰 경우를 제어해야한다면 ValueError를 잡을 준비가 필요합니다.

    >>> try:
    ...   random.sample(range(1, 2), 3)
    ... except ValueError:
    ...   print('Sample size exceeded population size.')
    ... 
    Sample size exceeded population size
    
  2. ==============================

    2.먼저 데이터 범위를 생성 한 후 다음과 같이 임의로 섞습니다.

    먼저 데이터 범위를 생성 한 후 다음과 같이 임의로 섞습니다.

    import random
    data = range(numLow, numHigh)
    random.shuffle(data)
    print data
    

    이렇게하면 특정 범위의 모든 숫자가 임의의 순서로 나타납니다.

    하지만 random.sample을 사용하면 다음과 같은 숫자 범위에서 필요한 요소의 수를 얻을 수 있습니다.

    print random.sample(range(numLow, numHigh), 3)
    
  3. ==============================

    3.n에 도달 할 때까지 세트에 추가 할 수 있습니다.

    n에 도달 할 때까지 세트에 추가 할 수 있습니다.

    setOfNumbers = set()
    while len(setOfNumbers) < n:
        setOfNumbers.add(random.randint(numLow, numHigh))
    

    n에 들어 맞는 범위보다 작은 범위에주의하십시오. 영원히 반복 할 것이고, n까지 삽입 할 새 번호를 찾을 수 없습니다.

  4. ==============================

    4.표준 라이브러리의 random.sample 함수를 사용하여 모집단에서 k 요소를 선택할 수 있습니다.

    표준 라이브러리의 random.sample 함수를 사용하여 모집단에서 k 요소를 선택할 수 있습니다.

    import random
    random.sample(range(low, high), n)
    

    가능한 숫자의 범위가 너무 큰 경우 itertools.islice를 무한 임의 생성기와 함께 사용할 수 있습니다.

    import itertools
    import random
    
    def random_gen(low, high):
        while True:
            yield random.randrange(low, high)
    
    gen = random_gen(1, 100)
    items = list(itertools.islice(gen, 10))  # take first 10 random elements
    

    최신 정보

    그래서, 질문을 갱신 한 후에, 이제는 명확하고 고유 한 (고유 한) 번호가 필요합니다.

    import itertools
    import random
    
    def random_gen(low, high):
        while True:
            yield random.randrange(low, high)
    
    gen = random_gen(1, 100)
    
    items = set()
    
    # try to add elem to set until set length is less than 10
    for x in itertools.takewhile(lambda x: len(items) < 10, gen): 
        items.add(x)
    
  5. from https://stackoverflow.com/questions/22842289/generate-n-unique-random-numbers-within-a-range by cc-by-sa and MIT license