파이썬 랜덤 함수 (random function) 정리
random.seed(a=None, version=2)
난수 생성기를 초기화합니다.
random.getstate()
생성기의 현재 내부 상태를 포착하는 객체를 반환합니다. 이 객체는 setstate()로 전달되어 상태를 복원 할 수 있습니다.
random.setstate(state)
state는 getstate()에 대한 이전 호출에서 얻은 것이어야 하고, setstate()는 생성기의 내부 상태를 getstate()가 호출될 당시의 상태로 복원합니다.
바이트열 함수
random.randbytes(n)
n 무작위 바이트를 생성합니다.
정수 함수
random.randrange(stop)
random.randrange(start, stop[, step])
range(start, stop, step)에서 임의로 선택된 요소를 반환합니다. 이것은 choice(range(start, stop, step))와 동등하지만, 실제로 range 객체를 만들지는 않습니다.
random.randint(a, b)
a <= N <= b를 만족하는 임의의 정수 N을 반환합니다. randrange(a, b+1)의 별칭.
random.getrandbits(k)
k 임의의 비트를 갖는 음이 아닌 파이썬 정수를 반환합니다.
random.choice(seq)
비어 있지 않은 시퀀스 seq에서 임의의 요소를 반환합니다. seq가 비어 있으면, IndexError를 발생시킵니다.
random.choices(population, weights=None, *, cum_weights=None, k=1)
population에서 중복을 허락하면서(with replacement) 선택한 k 크기의 요소 리스트를 반환합니다. population이 비어 있으면, IndexError를 발생시킵니다.
weights 시퀀스가 지정되면, 상대 가중치에 따라 선택됩니다. 대안적으로, cum_weights 시퀀스가 제공되면, (아마도 itertools.accumulate()를 사용하여 계산된) 누적 가중치(cumulative weights)에 따라 선택이 이루어집니다. 예를 들어, 상대 가중치 [10, 5, 30, 5]는 누적 가중치 [10, 15, 45, 50]과 동등합니다. 내부적으로, 상대 가중치는 선택하기 전에 누적 가중치로 변환되므로, 누적 가중치를 제공하면 작업이 줄어듭니다.
weights나 cum_weights를 지정하지 않으면, 같은 확률로 선택됩니다. weights 시퀀스가 제공되면, population 시퀀스와 길이가 같아야 합니다. weights와 cum_weights를 모두 지정하는 것은 TypeError입니다.
The weights or cum_weights can use any numeric type that interoperates with the float values returned by random() (that includes integers, floats, and fractions but excludes decimals). Weights are assumed to be non-negative and finite. A ValueError is raised if all weights are zero.
주어진 시드에 대해, 균등한 가중치를 갖는 choices() 함수는 일반적으로 choice()에 대한 반복 호출과는 다른 시퀀스를 생성합니다. choices()에서 사용하는 알고리즘은 내부 일관성과 속도를 위해 부동 소수점 산술을 사용합니다. choice()에서 사용하는 알고리즘은 자리 올림 오차로 인한 작은 바이어스(bias)를 피하려고 반복 선택을 통한 정수 산술로 기본 설정됩니다.
실수 분포
다음 함수는 특정 실수 분포를 생성합니다.
random.random()
[0.0, 1.0) 구간에서 다음 임의의 부동 소수점 숫자를 반환합니다.
정확한 범위는 1.0을 포함하지 않는 범위 입니다. (0.0 <= x < 1.0)
random.uniform(a, b)
a <= b 일 때 a <= N <= b, b < a 일 때 b <= N <= a를 만족하는 임의의 부동 소수점 숫자 N을 반환합니다.
종단 값 b는 방정식 a + (b-a) * random()의 부동 소수점 자리 올림에 따라 범위에 포함되거나 포함되지 않을 수 있습니다.
random.triangular(low, high, mode)
low <= N <= high를 만족하고 이 경계 사이에 지정된 모드(mode)를 갖는 임의의 부동 소수점 숫자 N을 반환합니다. low 및 high 경계는 기본적으로 0과 1입니다. mode 인자는 기본적으로 경계 사이의 중간 점으로, 대칭 분포를 제공합니다.
random.betavariate(alpha, beta)
베타 분포. 매개 변수의 조건은 alpha > 0과 beta > 0입니다. 반환된 값의 범위는 0에서 1입니다.
random.expovariate(lambd)
지수 분포. lambd는 1.0을 원하는 평균으로 나눈 값입니다. 0이 아니어야 합니다. (매개 변수는 “lambda”라고 부르지만, 파이썬에서는 예약어입니다.) 반환된 값의 범위는, lambd가 양수이면 0에서 양의 무한대이고, lambd가 음수이면 음의 무한대에서 0입니다.
random.gammavariate(alpha, beta)
감마 분포. (Not 감마 함수가 아닙니다!) 매개 변수의 조건은 alpha > 0과 beta > 0입니다.
확률 분포 함수는 다음과 같습니다:
x ** (alpha - 1) * math.exp(-x / beta)
pdf(x) = --------------------------------------
math.gamma(alpha) * beta ** alpha
random.gauss(mu=0.0, sigma=1.0)
Normal distribution, also called the Gaussian distribution. mu is the mean, and sigma is the standard deviation. This is slightly faster than the normalvariate() function defined below.
random.lognormvariate(mu, sigma)
로그 정규 분포. 이 분포의 자연로그를 취하면, 평균 mu와 표준 편차 sigma를 갖는 정규 분포를 얻게 됩니다. mu는 아무 값이나 될 수 있으며, sigma는 0보다 커야 합니다.
random.normalvariate(mu=0.0, sigma=1.0)
정규 분포. mu는 평균이고, sigma는 표준 편차입니다.
random.vonmisesvariate(mu, kappa)
mu는 0과 2*pi 사이의 라디안으로 표현된 평균 각도이며, kappa는 0 이상이어야 하는 집중도(concentration) 매개 변수입니다. kappa가 0이면, 이 분포는 0에서 2*pi에 걸친 균등한 임의의 각도로 환원됩니다.
random.paretovariate(alpha)
파레토 분포. alpha는 모양(shape) 매개 변수입니다.
random.weibullvariate(alpha, beta)
베이불 분포. alpha는 크기(scale) 매개 변수이고 beta는 모양(shape) 매개 변수입니다.
대체 생성기
class random.Random([seed])
random 모듈에서 사용하는 기본 의사 난수 생성기를 구현하는 클래스.
class random.SystemRandom([seed])
운영 체제에서 제공하는 소스에서 난수를 생성하기 위해 os.urandom() 함수를 사용하는 클래스. 모든 시스템에서 사용 가능한 것은 아닙니다. 소프트웨어 상태에 의존하지 않으며, 시퀀스는 재현되지 않습니다. 따라서, seed() 메서드는 효과가 없으며, 무시됩니다. getstate()와 setstate() 메서드는 호출되면 NotImplementedError를 발생시킵니다.
예제
기본 예제:
>>> random() # Random float: 0.0 <= x < 1.0
0.37444887175646646
>>> uniform(2.5, 10.0) # Random float: 2.5 <= x <= 10.0
3.1800146073117523
>>> expovariate(1 / 5) # Interval between arrivals averaging 5 seconds
5.148957571865031
>>> randrange(10) # Integer from 0 to 9 inclusive
7
>>> randrange(0, 101, 2) # Even integer from 0 to 100 inclusive
26
>>> choice(['win', 'lose', 'draw']) # Single random element from a sequence
'draw'
>>> deck = 'ace two three four'.split()
>>> shuffle(deck) # Shuffle a list
>>> deck
['four', 'two', 'ace', 'three']
>>> sample([10, 20, 30, 40, 50], k=4) # Four samples without replacement
[40, 10, 50, 30]
시뮬레이션:
>>> # Six roulette wheel spins (weighted sampling with replacement)
>>> choices(['red', 'black', 'green'], [18, 18, 2], k=6)
['red', 'green', 'black', 'black', 'red', 'black']
>>> # Deal 20 cards without replacement from a deck
>>> # of 52 playing cards, and determine the proportion of cards
>>> # with a ten-value: ten, jack, queen, or king.
>>> dealt = sample(['tens', 'low cards'], counts=[16, 36], k=20)
>>> dealt.count('tens') / 20
0.15
>>> # Estimate the probability of getting 5 or more heads from 7 spins
>>> # of a biased coin that settles on heads 60% of the time.
>>> def trial():
... return choices('HT', cum_weights=(0.60, 1.00), k=7).count('H') >= 5
...
>>> sum(trial() for i in range(10_000)) / 10_000
0.4169
>>> # Probability of the median of 5 samples being in middle two quartiles
>>> def trial():
... return 2_500 <= sorted(choices(range(10_000), k=5))[2] < 7_500
...
>>> sum(trial() for i in range(10_000)) / 10_000
0.7958
표본의 평균에 대한 신뢰 구간을 추정하기 위해 중복을 허용하는(with replacement) 재표본추출(resampling)을 사용하는 통계적 부트스트래핑(statistical bootstrapping)의 예:
# https://www.thoughtco.com/example-of-bootstrapping-3126155
from statistics import fmean as mean
from random import choices
data = [41, 50, 29, 37, 81, 30, 73, 63, 20, 35, 68, 22, 60, 31, 95]
means = sorted(mean(choices(data, k=len(data))) for i in range(100))
print(f'The sample mean of {mean(data):.1f} has a 90% confidence '
f'interval from {means[5]:.1f} to {means[94]:.1f}')
약물과 위약의 효과 간에 관찰된 차이의 통계적 유의성 또는 p-값을 결정하기 위한 재표본추출 순열 검증(resampling permutation test)의 예:
# Example from "Statistics is Easy" by Dennis Shasha and Manda Wilson
from statistics import fmean as mean
from random import shuffle
drug = [54, 73, 53, 70, 73, 68, 52, 65, 65]
placebo = [54, 51, 58, 44, 55, 52, 42, 47, 58, 46]
observed_diff = mean(drug) - mean(placebo)
n = 10_000
count = 0
combined = drug + placebo
for i in range(n):
shuffle(combined)
new_diff = mean(combined[:len(drug)]) - mean(combined[len(drug):])
count += (new_diff >= observed_diff)
print(f'{n} label reshufflings produced only {count} instances with a difference')
print(f'at least as extreme as the observed difference of {observed_diff:.1f}.')
print(f'The one-sided p-value of {count / n:.4f} leads us to reject the null')
print(f'hypothesis that there is no difference between the drug and the placebo.')
다중 서버 큐를 위한 도착 시간과 서비스 제공의 시뮬레이션:
from heapq import heapify, heapreplace
from random import expovariate, gauss
from statistics import mean, quantiles
average_arrival_interval = 5.6
average_service_time = 15.0
stdev_service_time = 3.5
num_servers = 3
waits = []
arrival_time = 0.0
servers = [0.0] * num_servers # time when each server becomes available
heapify(servers)
for i in range(1_000_000):
arrival_time += expovariate(1.0 / average_arrival_interval)
next_server_available = servers[0]
wait = max(0.0, next_server_available - arrival_time)
waits.append(wait)
service_duration = max(0.0, gauss(average_service_time, stdev_service_time))
service_completed = arrival_time + wait + service_duration
heapreplace(servers, service_completed)
print(f'Mean wait: {mean(waits):.1f} Max wait: {max(waits):.1f}')
print('Quartiles:', [round(q, 1) for q in quantiles(waits)])
These recipes show how to efficiently make random selections from the combinatoric iterators in the itertools module:
def random_product(*args, repeat=1):
"Random selection from itertools.product(*args, **kwds)"
pools = [tuple(pool) for pool in args] * repeat
return tuple(map(random.choice, pools))
def random_permutation(iterable, r=None):
"Random selection from itertools.permutations(iterable, r)"
pool = tuple(iterable)
r = len(pool) if r is None else r
return tuple(random.sample(pool, r))
def random_combination(iterable, r):
"Random selection from itertools.combinations(iterable, r)"
pool = tuple(iterable)
n = len(pool)
indices = sorted(random.sample(range(n), r))
return tuple(pool[i] for i in indices)
def random_combination_with_replacement(iterable, r):
"Random selection from itertools.combinations_with_replacement(iterable, r)"
pool = tuple(iterable)
n = len(pool)
indices = sorted(random.choices(range(n), k=r))
return tuple(pool[i] for i in indices)
from random import Random
from math import ldexp
class FullRandom(Random):
def random(self):
mantissa = 0x10_0000_0000_0000 | self.getrandbits(52)
exponent = -53
x = 0
while not x:
x = self.getrandbits(32)
exponent += x.bit_length() - 32
return ldexp(mantissa, exponent)
fr = FullRandom()
>>> fr.random()
0.05954861408025609
>>> fr.expovariate(0.25)
8.87925541791544
출처: python docs
버전: 3.11.1