最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python的random模塊及加權(quán)隨機(jī)算法的python實(shí)現(xiàn)方法

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

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

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

一般不必特別去設(shè)定seed,Python會(huì)自動(dòng)選擇seed。

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

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

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

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

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

•random.shuffle(x[,random])    用于將一個(gè)列表中的元素打亂 (洗牌),會(huì)改變?cè)剂斜?/p>

•random.sample(sequence,k)    從指定序列中隨機(jī)獲取k個(gè)元素作為一個(gè)片段返回,不會(huì)改變?cè)行蛄?/p>

那么現(xiàn)在基礎(chǔ)知識(shí)有了,我們來(lái)實(shí)現(xiàn)一個(gè)加權(quán)隨機(jī)算法:

加權(quán)隨機(jī)算法一般應(yīng)用在以下場(chǎng)景:有一個(gè)集合S,里面比如有A,B,C,D這四項(xiàng)。這時(shí)我們想隨機(jī)從中抽取一項(xiàng),但是抽取的概率不同,比如我們希望抽到A的概率是50%,抽到B和C的概率是20%,D的概率是10%。一般來(lái)說(shuō),我們可以給各項(xiàng)附一個(gè)權(quán)重,抽取的概率正比于這個(gè)權(quán)重。那么上述集合就成了:

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

方法一:

最簡(jiǎn)單的方法可以這樣:

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

# coding:utf-8
import random


def weight_choice(list, weight):
  """
  :param list: 待選取序列
  :param weight: list對(duì)應(yīng)的權(quán)重序列
  :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]))

方法二:

比較常用的方法是這樣:

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

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

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

# coding:utf-8
import random

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


def weight_choice(weight):
  """
  :param weight: list對(duì)應(yīng)的權(quán)重序列
  :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])])

方法三:

可以先對(duì)原始序列按照權(quán)重排序。這樣遍歷的時(shí)候,概率高的項(xiàng)可以很快遇到,減少遍歷的項(xiàng)。(因?yàn)閞nd遞減的速度最快(先減去最大的數(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í)間。

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

 

# coding:utf-8
import random
import bisect

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


def weight_choice(weight):
  """
  :param weight: list對(duì)應(yīng)的權(quán)重序列
  :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模塊及加權(quán)隨機(jī)算法的python實(shí)現(xiàn)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python datetime中strptime用法詳解

    python datetime中strptime用法詳解

    這篇文章主要介紹了python 中datetime中strptime用法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python遞歸實(shí)現(xiàn)快速排序

    python遞歸實(shí)現(xiàn)快速排序

    這篇文章主要為大家詳細(xì)介紹了python遞歸實(shí)現(xiàn)快速排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Python繪制動(dòng)態(tài)的521玫瑰花

    Python繪制動(dòng)態(tài)的521玫瑰花

    敲了這么多年代碼,每年都得畫(huà)一些心啊花啊什么的,所以現(xiàn)在常規(guī)的已經(jīng)有些倦怠了,至少也得來(lái)個(gè)三維圖形才看著比較合理,所以本文就來(lái)繪制一個(gè)動(dòng)態(tài)的玫瑰花吧
    2023-05-05
  • 給Python中的MySQLdb模塊添加超時(shí)功能的教程

    給Python中的MySQLdb模塊添加超時(shí)功能的教程

    這篇文章主要介紹了給Python中的MySQLdb模塊添加超時(shí)功能的教程,timeout功能在服務(wù)器的運(yùn)維當(dāng)中非常有用,需要的朋友可以參考下
    2015-05-05
  • Python中defaultdict與dict的差異詳情

    Python中defaultdict與dict的差異詳情

    這篇文章主要介紹了Python中defaultdict與dict的差異,在collections模塊中的defauldict使用時(shí)與dict有何不同,為何我們用dict中的key值不存在時(shí)會(huì)報(bào)錯(cuò),而defaudict不會(huì)報(bào)錯(cuò),下面文章做出解答,需要的朋友可以參考一下
    2021-11-11
  • Python 3.7新功能之dataclass裝飾器詳解

    Python 3.7新功能之dataclass裝飾器詳解

    這篇文章主要給大家介紹了關(guān)于Python 3.7新功能之dataclass裝飾器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Python自定義線程池實(shí)現(xiàn)方法分析

    Python自定義線程池實(shí)現(xiàn)方法分析

    這篇文章主要介紹了Python自定義線程池實(shí)現(xiàn)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python自定義線程池的概念、原理、實(shí)現(xiàn)方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2018-02-02
  • python pandas.DataFrame選取、修改數(shù)據(jù)最好用.loc,.iloc,.ix實(shí)現(xiàn)

    python pandas.DataFrame選取、修改數(shù)據(jù)最好用.loc,.iloc,.ix實(shí)現(xiàn)

    今天小編就為大家分享一篇python pandas.DataFrame選取、修改數(shù)據(jù)最好用.loc,.iloc,.ix實(shí)現(xiàn)。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 從零開(kāi)始學(xué)Python第八周:詳解網(wǎng)絡(luò)編程基礎(chǔ)(socket)

    從零開(kāi)始學(xué)Python第八周:詳解網(wǎng)絡(luò)編程基礎(chǔ)(socket)

    本篇文章主要介紹了從零開(kāi)始學(xué)Python第八周:詳解網(wǎng)絡(luò)編程基礎(chǔ)(socket) ,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2016-12-12
  • 大語(yǔ)言模型的開(kāi)發(fā)利器langchainan安裝使用快速入門(mén)學(xué)習(xí)

    大語(yǔ)言模型的開(kāi)發(fā)利器langchainan安裝使用快速入門(mén)學(xué)習(xí)

    這篇文章主要為大家介紹了大語(yǔ)言模型的開(kāi)發(fā)利器langchain安裝使用快速入門(mén)學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論

玛沁县| 临邑县| 类乌齐县| 惠州市| 溧水县| 合水县| 昌邑市| 通辽市| 弥渡县| 徐水县| 霍城县| 内黄县| 米脂县| 马鞍山市| 西乌珠穆沁旗| 仁怀市| 弋阳县| 六安市| 江达县| 静安区| 马山县| 阿克陶县| 信丰县| 新兴县| 台南市| 翁牛特旗| 永定县| 河南省| 卫辉市| 曲阜市| 余干县| 化德县| 涿州市| 平泉县| 阿克| 西藏| 泾川县| 鸡西市| 高雄市| 金塔县| 咸丰县|