파이썬에서 특정 길이로 난수를 생성하는 방법


105

3 자리 숫자가 필요하므로 다음과 같습니다.

>>> random(3)
563

or

>>> random(5)
26748
>> random(2)
56

답변:


182

임의의 3 자리 숫자를 얻으려면 :

from random import randint
randint(100, 999)  # randint is inclusive at both ends

( "최대 3 자리 숫자"가 아니라 실제로 3 자리 숫자를 의미한다고 가정합니다.)

임의의 자릿수를 사용하려면 :

from random import randint

def random_with_N_digits(n):
    range_start = 10**(n-1)
    range_end = (10**n)-1
    return randint(range_start, range_end)

print random_with_N_digits(2)
print random_with_N_digits(3)
print random_with_N_digits(4)

산출:

33
124
5127

7
이 솔루션을 사용하면 임의 풀에서 10 ** (N-1) 번호를 제거합니다
니쿠 Surdu

5
@NicolaeSurdu : 그렇기 때문에 "최대 3 자리"가 아니라 실제로 3 자리를 의미
RichieHindle 2012

3
037 100보다 작은 3 자리 숫자입니다. :). 그게 제가 의미하는 바입니다. 그러나 예, 비 복권 응용 프로그램의 경우 솔루션은 괜찮습니다.)
Nicu Surdu

@NicolaeSurdu 어떻게이 스 니펫이 037의 결과를 줄 수 있습니까 ??? n == 3 인 경우 (100에서 1000)의
randint입니다

3
@moldovean 위에서부터 읽으십시오 :). 나는 그 숫자를 원했고이 솔루션은 그 자릿수까지의 숫자가 아니라 정확히 그 자릿수를 제공합니다. 내 잘못이었고 괄호 안의 절을 놓쳤습니다.
Nicu Surdu

41

문자열 (예 : 10 자리 전화 번호)로 원하는 경우 다음을 사용할 수 있습니다.

n = 10
''.join(["{}".format(randint(0, 9)) for num in range(0, n)])

''.join (str (randint (0, 9)) for _ in range (n))
Mike Fogel

13

3 자리 숫자가 필요하고 001-099가 유효한 숫자가되도록하려면 randrange / randint를 사용해야합니다. 이는 대안보다 빠릅니다. 문자열로 변환 할 때 필요한 선행 0을 추가하기 만하면됩니다.

import random
num = random.randrange(1, 10**3)
# using format
num_with_zeros = '{:03}'.format(num)
# using string's zfill
num_with_zeros = str(num).zfill(3)

또는 난수를 int로 저장하지 않으려면 oneliner로 수행 할 수 있습니다.

'{:03}'.format(random.randrange(1, 10**3))

파이썬 3.6+ 단 하나의 라이너 :

f'{random.randrange(1, 10**3):03}'

위의 출력 예는 다음과 같습니다.

  • '026'
  • '255'
  • '512'

함수로 구현 :

import random

def n_len_rand(len_, floor=1):
    top = 10**len_
    if floor > top:
        raise ValueError(f"Floor {floor} must be less than requested top {top}")
    return f'{random.randrange(floor, top):0{len_}}'

5

0은 가능한 첫 번째 숫자로 계산됩니까? 그렇다면 random.randint(0,10**n-1). 그렇지 않은 경우 random.randint(10**(n-1),10**n-1). 0이 허용 되지 않으면 0이있는 숫자를 명시 적으로 거부하거나n random.randint(1,9) 합니다.

곁에 : randint(a,b)임의의 숫자를 얻기 위해 다소 파이썬 적이 지 않은 "인덱싱"을 사용 하는 것은 흥미 롭습니다 a <= n <= b. 사람은 그것처럼 작동 range하고 임의의 숫자를 생성 할 것으로 예상했을 수 a <= n < b있습니다. (닫힌 위쪽 간격에 유의하십시오.)

에 대한 코멘트에 응답을 감안할 때 randrange이러한 청소기로 대체 할 수 있습니다, random.randrange(0,10**n), random.randrange(10**(n-1),10**n)random.randrange(1,10).


@Andrew : a <= n <= b저도 놀랐습니다. 나는 그것을 -1내 코드에 추가해야하는 것을 분개한다 . :-)
RichieHindle 2010

1
@Andrew-재미있게도 Python 코드 randint(Lib / random.py에 있음)는 실제로 호출합니다 randrange(a, b+1)!
Daniel G

4

원하는 작업을 수행하는 작은 함수를 직접 작성할 수 있습니다.

import random
def randomDigits(digits):
    lower = 10**(digits-1)
    upper = 10**digits - 1
    return random.randint(lower, upper)

기본적으로 10**(digits-1)가장 작은 {digit} 자리 숫자를 10**digits - 1제공하고 가장 큰 {digit} 자리 숫자를 제공합니다 (가장 작은 {digit + 1} 자리 숫자에서 1을 뺀 숫자입니다!). 그런 다음 해당 범위에서 임의의 정수를 가져옵니다.


0

나는 RichieHindle의 대답을 정말 좋아했지만 연습으로 질문을 좋아했습니다. 다음은 문자열을 사용한 무차별 대입 구현입니다.)

import random
first = random.randint(1,9)
first = str(first)
n = 5

nrs = [str(random.randrange(10)) for i in range(n-1)]
for i in range(len(nrs))    :
    first += str(nrs[i])

print str(first)

0

로부터 공식 문서 , 그렇지 샘플 () 메소드는이 목적에 적합한 것을 보인다?

import random

def random_digits(n):
    num = range(0, 10)
    lst = random.sample(num, n)
    print str(lst).strip('[]')

산출:

>>>random_digits(5)
2, 5, 1, 0, 4

0

다음과 같이 int 목록을 사용하고 문자열을 변환하여 연결하고 int를 다시 캐스팅하는 함수를 만들 수 있습니다.

import random

def generate_random_number(length):
    return int(''.join([str(random.randint(0,10)) for _ in range(length)]))

특정 길이의 숫자를 생성하지 않습니다. :(
Prometheus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.