国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-02-23 04:12:37
字體:
供稿:網(wǎng)友

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è)剂斜?/p>

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

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

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

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

方法一:

最簡單的方法可以這樣:

把序列按權(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-8import randomdef 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-8import randomlist = ['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 iif __name__ == "__main__":  print(list[weight_choice([5, 2, 2, 1])])            
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 金门县| 鄄城县| 辽源市| 长顺县| 宁河县| 宁海县| 岐山县| 南昌市| 高要市| 桂平市| 马公市| 阳信县| 三明市| 巨野县| 惠东县| 二连浩特市| 大英县| 泗水县| 丰台区| 澄迈县| 泰顺县| 社旗县| 洛南县| 蒙城县| 广东省| 汨罗市| 贵南县| 定陶县| 东港市| 民县| 桦甸市| 泊头市| 奎屯市| 海晏县| 平昌县| 方正县| 青神县| 乐清市| 双牌县| 富顺县| 丁青县|