隨機選取演算法 有權重的記錄中選取

2021-07-02 16:59:22 字數 2542 閱讀 4584

三類隨機問題

1.  已有n條記錄,從中選取m條記錄,選取出來的記錄前後順序不管。

實現思路:按行遍歷所有記錄,約隔n/m條取乙個資料即可

2.  在1類情況下,還要求選取出來的m條記錄是隨機排序的

實現思路: 給n條記錄,分別增加一列標記,值為隨機選取的1至n之間的不重複資料,

實現參考博文將檔案內容按行隨機排列

3.  區別於1,2類問題, 如果記錄是有權重的,如何結合權重去隨機選取。 比如a的權重為10, b的權重股為5, c的權重為1, 則隨機選取4個時可能應該出現aabb。

4. 第四模擬較特殊,是對於記錄條數未知的帶有權重的隨機抽樣問題,具體演算法可以參照附件中的**:random sampling with a reservoir

這第三類問題是本文重點,下面開始解決。

實現思路:以 a:10, b:5, c:1 三條記錄上隨機選取4條為例,(是否以權重排序這個無所謂)

對於a10

b5c1

首先,將第n行的數值賦為第n行加第n-1行的,遞迴執行,如下:

a10b15

c16(這一步主要是保證整個序列是遞增有序的,並且相鄰元素之間的間隔長度代表元素被選取的概率,然後根據隨機演算法落到每個區間的值就代表了每個元素被抽取到的概率)

然後每次從[1,16]隨機選取乙個數,如果落在[1,10]之間,則選取a,如果落在(10,15]之間則選b,如果落在(16,16]之間則選取c, 圖示如下,誰佔的區間大(權重高),被選上的概率更大。

知道了思路,實現起來就比較方便了, 需要考慮的一點可能就是我隨即選了乙個數值,比如12,我怎麼跟b對應上? 其實也比較簡單,用二分法查詢即可。

下面附上實現**:

[cpp]view plain

copy

#include 

#include 

#include 

using

namespace

std;  

const

intlen = 4098;   

const

intmax_query_len = 2048;  

//返回屬於[p,q)的隨機數

intrand(

intp, 

intq)  

//刪除行尾換行符

intchomp(

char

*str)  

return

len;  

}  //獲取乙個隨機數會落在哪個區間

intget_pos(vector<

int> vec_freq, 

intbegin, 

intend, 

intrand_num)  

intmid = (begin + end)/2;  

if( vec_freq[mid] >= rand_num )  

else

}  //主函式

intmain(

intargc, 

char

*argv)  

file

* outfile = fopen(argv[2], 

"w");  

if( outfile == null)  

//要獲取的隨機記錄個數

intnum = atoi(argv[3]);  

if( num <= 0)  

//這兩個陣列用下標關聯

vectorvec_query;  

vector

> vec_freq;  

vec_query.clear();  

vec_freq.clear();  

intfreq = 0;  

char

line[max_query_len]=;  

while

( !feof(infile) )  

line[sizeof

(line)-1] = 0;  

chomp(line);  

char

* p_tab = strchr(line, 

'\t'

);  

if( null == p_tab )  

*p_tab = 0;  

string query(line);  

freq += atoi(p_tab+1);  

vec_query.push_back(query);  

vec_freq.push_back(freq);  

//printf("%s\t%d\n", line, freq);

}  for

(int

i=0; i 

fclose(infile);  

fclose(outfile);      

return

0;  

}  

隨機選取演算法 有權重的記錄中選取

三類隨機問題 1.已有n條記錄,從中選取m條記錄,選取出來的記錄前後順序不管。實現思路 按行遍歷所有記錄,約隔n m條取乙個資料即可 2.在1類情況下,還要求選取出來的m條記錄是隨機排序的 實現思路 給n條記錄,分別增加一列標記,值為隨機選取的1至n之間的不重複資料,實現參考博文將檔案內容按行隨機排...

織夢中選取特定的文章

注意 選取指定的文章,只能在arclist標籤裡,list是不能選取的,同時也沒有typeid field description 例子 所有只需在arclist裡加入idlist 373,387,277 表示呼叫id號為373,387,277的文件。field title 第二種 指定keywor...

按權重選取目標的java演算法

最近在做乙個武將系統,是乙個比較繁瑣的系統,用例比較多。安排了兩周時間給我開發,但是光是開發的話一周就夠了,剩下的時間用來除錯。關於這個系統,個人比較感興趣的是其中與權重有關的部分。每個武將有不同的出現機率,且每個武將對應多個權重不同的成長值。這裡有兩處地方與權重有關了,剛開始以為自己寫了個很巧妙的...