mysql按權重生成隨機數 按照指定的權重求隨機數

2021-10-20 23:12:06 字數 2044 閱讀 7467

原文:

按照指定的權重求隨機數

描述:通常取隨機數,取到每個數字的概率都是一樣,比如取 n 次,取到某個數的概率都是 1/n。現在情況發生了變化,要隨機取的數,每個數字都被設定了乙個權值(weight),比如:

上面這個圖表的含義是:進行隨機取數,取到 1 的概率是 1/5,取到 2 概率是 2/5,取到 3 的概率是 2/5。現在要求你使用**完成這個按照不同權值進行取值的過程。

一開始想到方法是:

使用乙個陣列 value ,陣列的下標對應於這個權重的範圍,下標對應的值就是要求的值,比如還是上面這個例子,比如在 1 < x <= 3這個區間範圍內,然後對整個區間長度求隨機值,rand(1, 5) 會得到乙個下標值,然後根據這個下標值去獲取想要的值。這個解法的問題是,如果某個值的權值很大,那麼需要乙個很大的陣列,這樣會非常非常消耗記憶體,顯然不是乙個很好的解決方法。不過當時也沒有想到更好的方法。

晚上回來想了想,有沒有可以優化的方向

p(x = 1) = 1/5 (x <= 1)

p(x = 2) = 2/5 (1 < x <= 3)

p(x = 3) = 2/5 (3 < x <= 5)

轉換成累積概率:

cp(x = 1) = 1/5 (x <= 1)

cp(x = 2) = 3/5 (1 < x <= 3)

cp(x = 3) = 1 (3 < x <= 5)

有上面這個對映關鍵,在 0 - 1 隨機取乙個數 x,如果 x <= cp[i] ,i 就是所要求的結果:

python 實現

import random

def random_by_weight(values, cp):

for v, w in zip(values, cp):

rand = random.randint(0, 1)

if rand <= w:

return v

選自:3.1、選擇運算元

遺傳演算法使用選擇運算對個體進行優勝劣汰操作。

適應度高的個體被遺傳到下一代群體中的概率大;適應度低的個體,被遺傳到下一代群體中的概率小。

選擇操作的任務就是從父代群體中選取一些個體,遺傳到下一代群體。

基本遺傳演算法(sga)中選擇運算元採用輪盤賭選擇方法。

ok,下面就來看下這個輪盤賭的例子,這個例子通俗易懂,對理解選擇運算元幫助很大。

輪盤賭選擇方法

輪盤賭選擇又稱比例選擇運算元,其基本思想是:

各個個體被選中的概率與其適應度函式值大小成正比。

設群體大小為n,個體xi 的適應度為 f(xi),則個體xi的選擇概率為:

輪盤賭選擇法可用如下過程模擬來實現:

(1)在[0, 1]內產生乙個均勻分布的隨機數r。

(2)若r≤q1,則染色體x1被選中。

(3)若qk-1

其中的qi稱為染色體xi (i=1, 2, …, n)的積累概率, 其計算公式為:

積累概率例項:

輪盤賭選擇方法的實現步驟:

(1)計算群體中所有個體的適應度值;

(2)計算每個個體的選擇概率;

(3)計算積累概率;

(4)採用模擬賭盤操作(即生成0到1之間的隨機數與每個個體遺傳到下一代群體的概率進行匹配)

來確定各個個體是否遺傳到下一代群體中。

例如,有染色體

s1= 13 (01101)

s2= 24 (11000)

s3= 8   (01000)

s4= 19 (10011)

假定適應度為f(s)=s^2 ,則

f (s1) = f(13) = 13^2 = 169

f (s2) = f(24) = 24^2 = 576

f (s3) = f(8) = 8^2 = 64

f (s4) = f(19) = 19^2 = 361

染色體的選擇概率為:

染色體的累計概率為:

根據上面的式子,可得到:

例如設從區間[0, 1]中產生4個隨機數:

r1 = 0.450126,    r2 = 0.110347

r3 = 0.572496,    r4 = 0.98503

Python 按照概率分布生成隨機數

import random 傳入陣列為概率分布列表例如 10,90 返回值為下標索引,返回值返回0的概率為10 返回1的概率為90 def random index rate 隨機變數的概率函式 引數rate為list int 返回概率事件的下標索引 start 0 index 0 randnum ...

按概率生成隨機數Java版本

思想什麼的可以參看http blog.csdn.net slowgrace archive 2009 03 25 4022632.aspx 如果要控制1個數落在某個區間的概率,比如要求在sngbegin和sngend之間生成乙個隨機數,這個隨機數落在sngpb和sngpe之間的概率是p 有兩種方法,...

按概率生成隨機數Java版本

思想什麼的可以參看 如果要控制1個數落在某個區間的概率,比如要求在sngbegin和sngend之間生成乙個隨機數,這個隨機數落在sngpb和sngpe之間的概率是p 有兩種方法,以第二種方法為好。先說第一種方法,要點是 1 由於sngpb和sngpe將整個區間分成3部分,所以先分別計算隨機數落在3...