欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python的random模塊及加權隨機算法的python實現(xiàn)方法

 更新時間:2017年01月04日 08:58:12   投稿:jingxian  
下面小編就為大家?guī)硪黄猵ython的random模塊及加權隨機算法的python實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

random是用于生成隨機數(shù)的,我們可以利用它隨機生成數(shù)字或者選擇字符串。

•random.seed(x)改變隨機數(shù)生成器的種子seed。

一般不必特別去設定seed,Python會自動選擇seed。

•random.random()    用于生成一個隨機浮點數(shù)n,0 <= n < 1

•random.uniform(a,b)    用于生成一個指定范圍內的隨機浮點數(shù),生成的隨機整數(shù)a<=n<=b;

•random.randint(a,b)    用于生成一個指定范圍內的整數(shù),a為下限,b為上限,生成的隨機整數(shù)a<=n<=b;若a=b,則n=a;若a>b,報錯

•random.randrange([start], stop [,step])    從指定范圍[start,stop)內,按指定基數(shù)遞增的集合中獲取一個隨機數(shù),基數(shù)缺省值為1

•random.choice(sequence)    從序列中獲取一個隨機元素,參數(shù)sequence表示一個有序類型,并不是一種特定類型,泛指list,tuple,字符串等

•random.shuffle(x[,random])    用于將一個列表中的元素打亂 (洗牌),會改變原始列表

•random.sample(sequence,k)    從指定序列中隨機獲取k個元素作為一個片段返回,不會改變原有序列

那么現(xiàn)在基礎知識有了,我們來實現(xiàn)一個加權隨機算法:

加權隨機算法一般應用在以下場景:有一個集合S,里面比如有A,B,C,D這四項。這時我們想隨機從中抽取一項,但是抽取的概率不同,比如我們希望抽到A的概率是50%,抽到B和C的概率是20%,D的概率是10%。一般來說,我們可以給各項附一個權重,抽取的概率正比于這個權重。那么上述集合就成了:

{A:5,B:2,C:2,D:1}

方法一:

最簡單的方法可以這樣:

把序列按權重值擴展成:lists=[A,A,A,A,A,B,B,C,C,D],然后random.choice(lists)隨機選一個就行。雖然這樣選取的時間復雜度是O(1),但是數(shù)據(jù)量一大,空間消耗就太大了。

# coding:utf-8
import random


def weight_choice(list, weight):
  """
  :param list: 待選取序列
  :param weight: list對應的權重序列
  :return:選取的值
  """
  new_list = []
  for i, val in enumerate(list):
    new_list.extend(val * weight[i])
  return random.choice(new_list)


if __name__ == "__main__":
  print(weight_choice(['A', 'B', 'C', 'D'], [5, 2, 2, 1]))

方法二:

比較常用的方法是這樣:

計算權重總和sum,然后在1到sum之間隨機選擇一個數(shù)R,之后遍歷整個集合,統(tǒng)計遍歷的項的權重之和,如果大于等于R,就停止遍歷,選擇遇到的項。

還是以上面的集合為例,sum等于10,如果隨機到1-5,則會在遍歷第一個數(shù)字的時候就退出遍歷。符合所選取的概率。

選取的時候要遍歷集合,它的時間復雜度是O(n)。

# coding:utf-8
import random

list = ['A', 'B', 'C', 'D']


def weight_choice(weight):
  """
  :param weight: list對應的權重序列
  :return:選取的值在原列表里的索引
  """
  t = random.randint(0, sum(weight) - 1)
  for i, val in enumerate(weight):
    t -= val
    if t < 0:
      return i


if __name__ == "__main__":
  print(list[weight_choice([5, 2, 2, 1])])

方法三:

可以先對原始序列按照權重排序。這樣遍歷的時候,概率高的項可以很快遇到,減少遍歷的項。(因為rnd遞減的速度最快(先減去最大的數(shù)))

比較{A:5,B:2,C:2,D:1}和{B:2,C:2,A:5,D:1}

前者遍歷步數(shù)的期望是5/10*1+2/10*2+2/10*3+1/10*4=19/10而后者是2/10*1+2/10*2+5/10*3+1/10*4=25/10。

這樣提高了平均選取速度,但是原序列排序也需要時間。

先搞一個權重值的前綴和序列,然后在生成一個隨機數(shù)t后,可以用二分法來從這個前綴和序列里找,那么選取的時間復雜度就是O(logn)了。

 

# coding:utf-8
import random
import bisect

list = ['A', 'B', 'C', 'D']


def weight_choice(weight):
  """
  :param weight: list對應的權重序列
  :return:選取的值在原列表里的索引
  """
  weight_sum = []
  sum = 0
  for a in weight:
    sum += a
    weight_sum.append(sum)
  t = random.randint(0, sum - 1)
  return bisect.bisect_right(weight_sum, t)


if __name__ == "__main__":
  print(list[weight_choice([5, 2, 2, 1])])

以上這篇python的random模塊及加權隨機算法的python實現(xiàn)方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • python語法教程之def()函數(shù)定義及用法

    python語法教程之def()函數(shù)定義及用法

    函數(shù)是組織好的,可重復使用的,用來實現(xiàn)單一,或相關聯(lián)功能的代碼段,下面這篇文章主要給大家介紹了關于python語法教程之def()函數(shù)定義及用法的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • python數(shù)據(jù)結構樹和二叉樹簡介

    python數(shù)據(jù)結構樹和二叉樹簡介

    這篇文章主要介紹了python數(shù)據(jù)結構樹和二叉樹簡介,需要的朋友可以參考下
    2014-04-04
  • Python?GUI?圖形用戶界面

    Python?GUI?圖形用戶界面

    這篇文章主要介紹了Python?GUI?圖形用戶界面,圖形用戶界面是指采用圖形方式顯示的計算機操作用戶界面,詳細介紹需要的小伙伴可以參考一下下面文章詳情
    2022-07-07
  • 如何把外網python虛擬環(huán)境遷移到內網

    如何把外網python虛擬環(huán)境遷移到內網

    這篇文章主要介紹了如何把外網python虛擬環(huán)境遷移到內網,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Python imread、newaxis用法詳解

    Python imread、newaxis用法詳解

    這篇文章主要介紹了python imread、newaxis用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Python+Pygame編寫一個Pong游戲

    Python+Pygame編寫一個Pong游戲

    Pong游戲模擬了兩個打乒乓球的人,就是在兩條線中間有一個點在動,操縱器就是一個搖桿上有一個按鈕的那種。本文就來用Python中的Pygame庫編寫一個Pong小游戲
    2023-01-01
  • 基于Python實現(xiàn)的戀愛對話小程序詳解

    基于Python實現(xiàn)的戀愛對話小程序詳解

    這篇文章主要介紹了基于Python制作一個戀愛對話小程序,文章詳細介紹了小程序的實現(xiàn)過程,感興趣的小伙伴可以跟隨小編一起學習學習
    2022-01-01
  • Django項目實戰(zhàn)之用戶頭像上傳與訪問的示例

    Django項目實戰(zhàn)之用戶頭像上傳與訪問的示例

    這篇文章主要介紹了Django項目實戰(zhàn)之用戶頭像上傳與訪問的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • python人工智能算法之決策樹流程示例詳解

    python人工智能算法之決策樹流程示例詳解

    這篇文章主要為大家介紹了python人工智能算法之決策樹流程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 在Linux中通過Python腳本訪問mdb數(shù)據(jù)庫的方法

    在Linux中通過Python腳本訪問mdb數(shù)據(jù)庫的方法

    這篇文章主要介紹了在Linux中通過Python腳本訪問mdb數(shù)據(jù)庫的方法,本文示例基于debian系的Linux系統(tǒng),需要的朋友可以參考下
    2015-05-05

最新評論