random 模塊詳細用法大全


  random.seed(a=None, version=2)

  初始化隨機數生成器。

  如果 a 被省略或為 None ,則使用當前系統時間。 如果操作系統提供隨機源,則使用它們而不是系統時間(有關可用性的詳細信息,請參閱 os.urandom() 函數)。

  如果 a 是 int 類型,則直接使用。

  對於版本2(默認的),str 、 bytes 或 bytearray 對象轉換為 int 並使用它的所有位。

  對於版本1(用於從舊版本的Python再現隨機序列),用於 str 和 bytes 的算法生成更窄的種子范圍。

  在 3.2 版更改: 已移至版本2方案,該方案使用字符串種子中的所有位。

  random.getstate()

  返回捕獲生成器當前內部狀態的對象。 這個對象可以傳遞給 setstate() 來恢復狀態。

  random.setstate(state)

  state 應該是從之前調用 getstate() 獲得的,並且 setstate() 將生成器的內部狀態恢復到 getstate() 被調用時的狀態。

  random.getrandbits(k)

  返回帶有 k 位隨機的Python整數。 此方法隨 MersenneTwister 生成器一起提供,其他一些生成器也可以將其作為API的可選部分提供。 如果可用,getrandbits() 啟用 randrange() 來處理任意大范圍。

  整數用函數

  random.randrange(stop)

  random.randrange(start, stop[, step])

  從 range(start, stop, step) 返回一個隨機選擇的元素。 這相當於 choice(range(start, stop, step)) ,但實際上並沒有構建一個 range 對象。

  位置參數模式匹配 range() 。不應使用關鍵字參數,因為該函數可能以意外的方式使用它們。

  在 3.2 版更改: randrange() 在生成均勻分布的值方面更為復雜。 以前它使用了像``int(random()*n)``這樣的形式,它可以產生稍微不均勻的分布。

  random.randint(a, b)

  返回隨機整數 N 滿足 a <=N <=b。相當於 randrange(a, b+1)。

  序列用函數

  random.choice(seq)

  從非空序列 seq 返回一個隨機元素。 如果 seq 為空,則引發 IndexError。

  random.choices(population, weights=None, *, cum_weights=None, k=1)

  從*population*中選擇替換,返回大小為 k 的元素列表。 如果 population 為空,則引發 IndexError。

  如果指定了 weight 序列,則根據相對權重進行選擇。 或者,如果給出 cum_weights 序列,則根據累積權重(可能使用 itertools.accumulate() 計算)進行選擇。 例如,相對權重``[10, 5, 30, 5]``相當於累積權重``[10, 15, 45, 50]``。 在內部,相對權重在進行選擇之前會轉換為累積權重,因此提供累積權重可以節省工作量。

  如果既未指定 weight 也未指定 cum_weights ,則以相等的概率進行選擇。 如果提供了權重序列,則它必須與 population 序列的長度相同。 一個 TypeError 指定了 weights 和*cum_weights*。

  weights 或 cum_weights 可以使用任何與 random() 返回的 float 值互操作的數值類型(包括整數,浮點數和分數但不包括十進制小數)。

  對於給定的種子,具有相等加權的 choices() 函數通常產生與重復調用 choice() 不同的序列。 choices() 使用的算法使用浮點運算來實現內部一致性和速度。 choice() 使用的算法默認為重復選擇的整數運算,以避免因舍入誤差引起的小偏差。

  3.6 新版功能.

  random.shuffle(x[, random])

  將序列 x 隨機打亂位置。

  可選參數 random 是一個0參數函數,在 [0.0, 1.0) 中返回隨機浮點數;默認情況下,這是函數 random() 。

  要改變一個不可變的序列並返回一個新的打亂列表,請使用``sample(x, k=len(x))``。

  請注意,即使對於小的 len(x),x 的排列總數也可以快速增長,大於大多數隨機數生成器的周期。 這意味着長序列的大多數排列永遠不會產生。 例如,長度為2080的序列是可以在 Mersenne Twister 隨機數生成器的周期內擬合的最大序列。

  random.sample(population, k)

  返回從總體序列或集合中選擇的唯一元素的 k 長度列表。 用於無重復的隨機抽樣。

  返回包含來自總體的元素的新列表,同時保持原始總體不變。 結果列表按選擇順序排列,因此所有子切片也將是有效的隨機樣本。 這允許抽獎獲獎者(樣本)被划分為大獎和第二名獲勝者(子切片)。

  總體成員不必是 hashable 或 unique 。 如果總體包含重復,則每次出現都是樣本中可能的選擇。

  要從一系列整數中選擇樣本,請使用 range() 對象作為參數。 對於從大量人群中采樣,這種方法特別快速且節省空間:sample(range(10000000), k=60) 。

  如果樣本大小大於總體大小,則引發 ValueError 。

  實值分布

  以下函數生成特定的實值分布。如常用數學實踐中所使用的那樣, 函數參數以分布方程中的相應變量命名;大多數這些方程都可以在任何統計學教材中找到。

  random.random()

  返回 [0.0, 1.0) 范圍內的下一個隨機浮點數。

  random.uniform(a, b)

  返回一個隨機浮點數 N ,當 a <=b 時 a <=N <=b ,當 b < a 時 b <=N <=a 。

  取決於等式 a + (b-a) * random() 中的浮點舍入,終點 b 可以包括或不包括在該范圍內。

  random.triangular(low, high, mode)

  返回一個隨機浮點數 N ,使得 low <=N <=high 並在這些邊界之間使用指定的 mode 。 low 和 high 邊界默認為零和一。 mode 參數默認為邊界之間的中點,給出對稱分布。

  random.betavariate(alpha, beta)

  Beta 分布。 參數的條件是 alpha > 0 和 beta > 0。 返回值的范圍介於 0 和 1 之間。

  random.expovariate(lambd)

  指數分布。 lambd 是 1.0 除以所需的平均值,它應該是非零的。 (該參數本應命名為 “lambda” ,但這是 Python 中的保留字。)如果 lambd 為正,則返回值的范圍為 0 到正無窮大;如果 lambd 為負,則返回值從負無窮大到 0。

  random.gammavariate(alpha, beta)

  Gamma 分布。 ( 不是 gamma 函數! ) 參數的條件是 alpha > 0 和 beta > 0。

  概率分布函數是:

  x ** (alpha - 1) * math.exp(-x / beta)

  pdf(x)=--------------------------------------

  math.gamma(alpha) * beta ** alpha

  random.gauss(mu, sigma)

  高斯分布。 mu 是平均值,sigma 是標准差。 這比下面定義的 normalvariate() 函數略快。

  random.lognormvariate(mu, sigma)

  對數正態分布。 如果你采用這個分布的自然對數,你將得到一個正態分布,平均值為 mu 和標准差為 sigma。 mu 可以是任何值,sigma 必須大於零。

  random.normalvariate(mu, sigma)

  正態分布。 mu 是平均值,sigma 是標准差。

  random.vonmisesvariate(mu, kappa)

  mu 是平均角度,以弧度表示,介於0和 2*pi 之間,kappa 是濃度參數,必須大於或等於零。 如果 kappa 等於零,則該分布在0到 2*pi 的范圍內減小到均勻的隨機角度。

  random.paretovariate(alpha)

  帕累托分布。 alpha 是形狀參數。

  random.weibullvariate(alpha, beta)

  威布爾分布。 alpha 是比例參數,beta 是形狀參數。

  替代生成器

  class random.Random([seed])

  。該類實現了 random 模塊所用的默認偽隨機數生成器。

  class random.SystemRandom([seed])

  使用 os.urandom() 函數的類,用從操作系統提供的源生成隨機數。 這並非適用於所有系統。 也不依賴於軟件狀態,序列不可重現。 因此,seed() 方法沒有效果而被忽略。 getstate() 和 setstate() 方法如果被調用則引發 NotImplementedError。

  關於再現性的說明

  有時能夠重現偽隨機數生成器給出的序列是有用的。 通過重新使用種子值,只要多個線程沒有運行,相同的序列就可以在兩次不同運行之間重現。

  大多數隨機模塊的算法和種子函數都會在 Python 版本中發生變化,但保證兩個方面不會改變:

  如果添加了新的播種方法,則將提供向后兼容的播種機。當兼容的播種機被賦予相同的種子時,生成器的 random() 方法將繼續產生相同的序列。

  例子和配方

  基本示例:

  >>>

  >>> 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

  >>> # (a ten, jack, queen, or king).

  >>> deck=collections.Counter(tens=16, low_cards=36)

  >>> seen=sample(list(deck.elements()), k=20)

  >>> seen.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(10000)) / 10000

  0.4169

  >>> # Probability of the median of 5 samples being in middle two quartiles

  >>> def trial():

  ... return 2500 <=sorted(choices(range(10000), k=5))[2] < 7500

  ...

  >>> sum(trial() for i in range(10000)) / 10000

  0.7958

  statistical bootstrapping 使用重采樣和替換來估計大小為五的樣本的均值的置信區間的示例:

  # statistics.about/od/Applications/a/Example-Of-Bootstrapping.htm

  from statistics import mean

  from random import choices

  data=1, 2, 4, 4, 10

  means=sorted(mean(choices(data, k=5)) for i in range(20))

  print(f'The sample mean of {mean(data):.1f} has a 90% confidence '

  f'interval from {means[1]:.1f} to {means[-2]:.1f}')

  使用 重新采樣排列測試 來確定統計學顯著性或者使用 p-值 來觀察葯物與安慰劑的作用之間差異的示例:

  # Example from "Statistics is Easy" by Dennis Shasha and Manda Wilson

  from statistics import 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=10000

  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 random import expovariate, gauss

  from statistics import mean, median, stdev

  average_arrival_interval=5.6

  average_service_time=5.0

  stdev_service_time=0.5

  num_waiting=0

  arrivals=[]

  starts=[]

  arrival=service_end=0.0

  for i in range(20000):

  if arrival <=service_end:

  num_waiting +=1

  arrival +=expovariate(1.0 / average_arrival_interval)

  arrivals.append(arrival)

  else:

  num_waiting -=1

  service_start=service_end if num_waiting else arrival

  service_time=gauss(average_service_time, stdev_service_time)

  service_end=service_start + service_time

  starts.append(service_start)

  waits=[start - arrival for arrival, start in zip(arrivals, starts)]

  print(f'Mean wait: {mean(waits):.1f}. Stdev wait: {stdev(waits):.1f}.')

  print(f'Median wait: {median(waits):.1f}. Max wait: {max(waits):.1f}.')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM