개발/Python

0에서 9 사이의 임의의 정수 생성

MinorMan 2020. 9. 18. 02:55
반응형

<질문>

파이썬에서 0에서 9 (포함) 사이의 임의의 정수를 어떻게 생성 할 수 있습니까?

예 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9


<답변1>

시험:

from random import randrange
print(randrange(10))

문서 : https://docs.python.org/3/library/random.html#random.randrange


<답변2>

import random
print(random.randint(0,9))
random.randint(a, b)

a <= N <= b가되는 임의의 정수 N을 반환합니다.

문서 : https://docs.python.org/3.1/library/random.html#random.randint


<답변3>

이 시도:

from random import randrange, uniform

# randrange gives you an integral value
irand = randrange(0, 10)

# uniform gives you a floating-point value
frand = uniform(0, 10)

<답변4>

from random import randint

x = [randint(0, 9) for p in range(0, 10)]

이것은 0에서 9까지의 범위에서 10 개의 의사 난수 정수를 생성합니다.


<답변5>

secrets 모듈은 Python 3.6의 새로운 기능입니다. 이것은 암호화 또는 보안 용도의 임의 모듈보다 낫습니다.

0-9 범위의 정수를 무작위로 인쇄하려면 :

from secrets import randbelow
print(randbelow(10))

자세한 내용은 PEP 506을 참조하십시오.


<답변6>

배열의 크기를 선택합니다 (이 예에서는 크기를 20으로 선택했습니다). 그런 다음 다음을 사용하십시오.

import numpy as np   
np.random.randint(10, size=(1, 20))

다음과 같은 형식의 출력을 볼 수 있습니다 (실행할 때마다 다른 임의의 정수가 반환되므로 출력 배열의 정수가 아래에 제공된 예와 다를 수 있음).

array([[1, 6, 1, 2, 8, 6, 3, 3, 2, 5, 6, 5, 0, 9, 5, 6, 4, 5, 9, 3]])

<답변7>

random.shuffle을 통해 시도하십시오.

>>> import random
>>> nums = range(10)
>>> random.shuffle(nums)
>>> nums
[6, 3, 5, 4, 0, 1, 2, 9, 8, 7]

<답변8>

다음 중 하나를 시도합니다.

1.> numpy.random.randint

import numpy as np
X1 = np.random.randint(low=0, high=10, size=(15,))

print (X1)
>>> array([3, 0, 9, 0, 5, 7, 6, 9, 6, 7, 9, 6, 6, 9, 8])

2.> numpy.random.uniform

import numpy as np
X2 = np.random.uniform(low=0, high=10, size=(15,)).astype(int)

print (X2)
>>> array([8, 3, 6, 9, 1, 0, 3, 6, 3, 3, 1, 2, 4, 0, 4])

3.> random.randrange

from random import randrange
X3 = [randrange(10) for i in range(15)]

print (X3)
>>> [2, 1, 4, 1, 2, 8, 8, 6, 4, 1, 0, 5, 8, 3, 5]

4.> random.randint

from random import randint
X4 = [randint(0, 9) for i in range(0, 15)]

print (X4)
>>> [6, 2, 6, 9, 5, 3, 2, 3, 3, 4, 4, 7, 4, 9, 6]

속도:

► np.random.randint가 가장 빠르고 np.random.uniform 및 random.randrange가 그 뒤를 따릅니다. random.randint가 가장 느립니다.

► np.random.randint 및 np.random.uniform 모두 random.randrange 및 random.randint보다 훨씬 빠릅니다 (~ 8-12 배 빠름).

%timeit np.random.randint(low=0, high=10, size=(15,))
>> 1.64 µs ± 7.83 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit np.random.uniform(low=0, high=10, size=(15,)).astype(int)
>> 2.15 µs ± 38.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit [randrange(10) for i in range(15)]
>> 12.9 µs ± 60.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit [randint(0, 9) for i in range(0, 15)]
>> 20 µs ± 386 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

노트:

1.> np.random.randint는 반 개방 간격 (낮음, 높음) 동안 임의의 정수를 생성합니다. 2.> np.random.uniform은 반 개방 구간 (낮음, 높음) 동안 균일하게 분포 된 숫자를 생성합니다. 3.> random.randrange (stop)는 범위 (시작, 중지, 단계)에서 난수를 생성합니다. 4.> random.randint (a, b)는 a <= N <= b가되는 임의의 정수 N을 반환합니다. 5.> astype (int)은 numpy 배열을 int 데이터 유형으로 캐스팅합니다. 6.> 크기 = (15,)를 선택했습니다. 이것은 길이 = 15의 배열을 제공합니다.


<답변9>

많은 게시물이 임의의 정수 하나를 얻는 방법을 보여 주지만 원래 질문은 임의의 정수 (복수)를 생성하는 방법을 묻습니다.

파이썬에서 0에서 9 (포함) 사이의 임의의 정수를 어떻게 생성 할 수 있습니까?

명확성을 위해 여기에서는 여러 임의의 정수를 얻는 방법을 보여줍니다.

주어진

>>> import random


lo = 0
hi = 10
size = 5

암호

다중, 임의의 정수

# A
>>> [lo + int(random.random() * (hi - lo)) for _ in range(size)]
[5, 6, 1, 3, 0]

# B
>>> [random.randint(lo, hi) for _ in range(size)]
[9, 7, 0, 7, 3]

# C
>>> [random.randrange(lo, hi) for _ in range(size)]
[8, 3, 6, 8, 7]

# D
>>> lst = list(range(lo, hi))
>>> random.shuffle(lst)
>>> [lst[i] for i in range(size)]
[6, 8, 2, 5, 1]

# E
>>> [random.choice(range(lo, hi)) for _ in range(size)]
[2, 1, 6, 9, 5]

임의의 정수 샘플

# F
>>> random.choices(range(lo, hi), k=size)
[3, 2, 0, 8, 2]

# G
>>> random.sample(range(lo, hi), k=size)
[4, 5, 1, 2, 3]

세부

일부 게시물은 기본적으로 여러 임의의 정수를 생성하는 방법을 보여줍니다. 다음은 암시 된 질문을 해결하는 몇 가지 옵션입니다.

Random 모듈의 예제를 사용하여 Chunking 및 Aliasing에 대한 R. Hettinger의 강연도 참조하십시오.

다음은 표준 라이브러리와 Numpy의 일부 임의 함수를 비교 한 것입니다.

| | random                | numpy.random                     |
|-|-----------------------|----------------------------------|
|A| random()              | random()                         |
|B| randint(low, high)    | randint(low, high)               |
|C| randrange(low, high)  | randint(low, high)               |
|D| shuffle(seq)          | shuffle(seq)                     |
|E| choice(seq)           | choice(seq)                      |
|F| choices(seq, k)       | choice(seq, size)                |
|G| sample(seq, k)        | choice(seq, size, replace=False) |

Numpy의 여러 분포 중 하나를 임의의 정수 샘플로 빠르게 변환 할 수도 있습니다.

>>> np.random.normal(loc=5, scale=10, size=size).astype(int)
array([17, 10,  3,  1, 16])

>>> np.random.poisson(lam=1, size=size).astype(int)
array([1, 3, 0, 2, 0])

>>> np.random.lognormal(mean=0.0, sigma=1.0, size=size).astype(int)
array([1, 3, 1, 5, 1])

1 즉, @John Lawrence Aspden, @ST Mohammed, @SiddTheKid, @ user14372, @zangw, et al. 2 @ prashanth는 하나의 정수를 보여주는이 모듈을 언급합니다. 3 @Siddharth Satpathy가 시연


<답변10>

연속적인 숫자의 경우 randint 또는 randrange가 최선의 선택 일 수 있지만 시퀀스 (즉, 목록)에 여러 개의 고유 한 값이있는 경우 choice를 사용할 수도 있습니다.

>>> import random
>>> values = list(range(10))
>>> random.choice(values)
5

선택은 비 연속 샘플의 한 항목에도 적용됩니다.

>>> values = [1, 2, 3, 5, 7, 10]
>>> random.choice(values)
7

"암호 적으로 강력 함"이 필요한 경우 python 3.6 이상에서 secrets.choice도 있습니다.

>>> import secrets
>>> values = list(range(10))
>>> secrets.choice(values)
2

<답변11>

numpy를 사용하려면 다음을 사용하십시오.

import numpy as np
print(np.random.randint(0,10))

<답변12>

>>> import random
>>> random.randrange(10)
3
>>> random.randrange(10)
1

10 개의 샘플 목록을 얻으려면 :

>>> [random.randrange(10) for x in range(10)]
[9, 0, 4, 0, 5, 7, 4, 3, 6, 8]

<답변13>

0에서 9 사이의 임의의 정수를 생성합니다.

import numpy
X = numpy.random.randint(0, 10, size=10)
print(X)

산출:

[4 8 0 4 9 6 9 9 0 7]

<답변14>

random.sample도 사용할 수 있습니다.

import random
n = 1 # specify the no. of numbers
num = random.sample(range(10),  n)
num[0] # is the required number

<답변15>

가장 좋은 방법은 임의 가져 오기 기능을 사용하는 것입니다.

import random
print(random.sample(range(10), 10))

또는 라이브러리 가져 오기없이 :

n={} 
for i in range(10):
    n[i]=i

for p in range(10):
    print(n.popitem()[1])

여기서 popitems는 사전 n에서 임의의 값을 제거하고 반환합니다.


<답변16>

이것은 수학적 접근 방식에 가깝지만 항상 100 % 작동합니다.

random.random () 함수를 사용하여 a와 b 사이의 숫자를 생성한다고 가정 해 보겠습니다. 이를 달성하려면 다음을 수행하십시오.

num = (ba) * random.random () + a;

물론 더 많은 숫자를 생성 할 수 있습니다.


<답변17>

임의 모듈에 대한 문서 페이지에서 :

경고 :이 모듈의 의사 랜덤 생성기는 보안 목적으로 사용해서는 안됩니다. 암호 학적으로 안전한 의사 난수 생성기가 필요한 경우 os.urandom () 또는 SystemRandom을 사용하십시오.

Python 2.4에 도입 된 random.SystemRandom은 암호 적으로 안전한 것으로 간주됩니다. 작성 당시 최신 버전 인 Python 3.7.1에서 여전히 사용할 수 있습니다.

>>> import string
>>> string.digits
'0123456789'
>>> import random
>>> random.SystemRandom().choice(string.digits)
'8'
>>> random.SystemRandom().choice(string.digits)
'1'
>>> random.SystemRandom().choice(string.digits)
'8'
>>> random.SystemRandom().choice(string.digits)
'5'

string.digits 대신에 이해력과 함께 다른 답변 중 일부에 대해 범위를 사용할 수 있습니다. 필요에 따라 믹스 앤 매치하십시오.


<답변18>

OpenTURNS는 임의의 정수를 시뮬레이션 할뿐만 아니라 UserDefined 정의 클래스와 관련된 분포를 정의 할 수 있습니다.

다음은 분포의 12 가지 결과를 시뮬레이션합니다.

import openturns as ot
points = [[i] for i in range(10)]
distribution = ot.UserDefined(points) # By default, with equal weights.
for i in range(12):
    x = distribution.getRealization()
    print(i,x)

이것은 다음을 인쇄합니다.

0 [8]
1 [7]
2 [4]
3 [7]
4 [3]
5 [3]
6 [2]
7 [9]
8 [0]
9 [5]
10 [9]
11 [6]

x는 1 차원의 점이기 때문에 괄호가 있습니다. getSample에 대한 단일 호출로 12 개의 결과를 생성하는 것이 더 쉬울 것입니다.

sample = distribution.getSample(12)

다음을 생성합니다.

>>> print(sample)
     [ v0 ]
 0 : [ 3  ]
 1 : [ 9  ]
 2 : [ 6  ]
 3 : [ 3  ]
 4 : [ 2  ]
 5 : [ 6  ]
 6 : [ 9  ]
 7 : [ 5  ]
 8 : [ 9  ]
 9 : [ 5  ]
10 : [ 3  ]
11 : [ 2  ]

이 주제에 대한 자세한 내용은 http://openturns.github.io/openturns/master/user_manual/_generated/openturns.UserDefined.html을 참조하세요.


<답변19>

나는 Python 3.6에서 더 나은 운이 좋았습니다.

str_Key = ""                                                                                                
str_RandomKey = ""                                                                                          
for int_I in range(128):                                                                                    
      str_Key = random.choice('0123456789')
      str_RandomKey = str_RandomKey + str_Key 

'ABCD'및 'abcd'또는 '^! ~ =-> <'와 같은 문자를 추가하여 가져올 문자 풀을 변경하고 범위를 변경하여 생성 된 문자 수를 변경하십시오.

반응형