亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 1806 0

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è)有序類型,并不是一種特定類型,泛指list,tuple,字符串等

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

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

那么現(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è)參考,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 欧美日本一区亚洲欧美一区 | 日本老年人精品久久中文字幕 | 久久亚洲精品中文字幕亚瑟 | 老太做爰xxxx视频 | 久久 精品 一区二区 | 99久久精品费精品国产一区二 | 四虎黄色影视 | 毛片一 | 久久91亚洲精品中文字幕 | 亚洲大片免费观看 | 精品国产不卡一区二区三区 | 四虎影视最新网站在线播放 | 国产美女午夜精品福利视频 | 欧美三级一区二区三区 | 亚洲线精品久久一区二区三区 | 日韩综合一区 | 男人深夜影院 | 色综合合久久天天给综看 | 一级毛片免费视频日本 | 夜夜做日日做夜夜爽 | 日本久久伊人 | 最新国产在线视频 | 亚洲国产99999在线精品一区 | 天天干天天做 | 成人欧美一区二区三区视频不卡 | 国产福利在线观看第二区 | 亚洲精品欧洲久久婷婷99 | 亚洲精品第一综合99久久 | 奇米第四狠狠777高清秒播 | 在线观看精品91老司机 | 青青青免费手机版视频在线观看 | 四虎成人免费观看在线网址 | 在线精品国产一区二区 | 久久午夜伦理 | 亚洲免费成人在线 | 9999热视频 | 日本国产一区二区三区 | 欧美黄色录像视频 | 97免费视频观看 | 暴劫倾情无删减在线播放 | 国内精品在线视频 |