隨機取樣演算法

2021-06-23 08:22:41 字數 1121 閱讀 4957

最近學習程式設計珠璣,看到隨機取樣演算法,很不錯,這裡也整理下:

首先來看乙個簡單的取樣演算法,這裡假定在不考慮重複的情況下,從1-n之間取出m個數來

void ******rand(int m, int n)

這樣子的話,很容易得到如下的輸出:

這樣子的話,倒是適合「石頭-剪刀-布」,一類的小遊戲

但很多情況下,我們需要的是沒有重複的隨機數,如何從1-n中取出m個數呢,這裡看看如下的偽**

initialize set s to empty

size = 0

while size < m do

t := randint(1, n)

if t is not in s then

insert t in s

size := size + 1

這個演算法,很不錯,由於集合儲存不同資料,所以最終得到的隨機樣本中,沒有重複資料,見**

void ******rand2(int m, int n)	}	

for (set::iterator i = s.begin(); i != s.end(); ++i)

cout << *i << " ";

cout << endl;

}

這一次,得出的結果已經很不錯了

可惜,還是有乙個重大問題,如果m = n = 100呢,當size = 99時,最後乙個數,演算法只能閉眼瞎猜,直到偶然碰到那個數,這平均需要猜測100個隨機數。

好了,不要著急,我們額度改良演算法馬上就來到了

這裡利用遞迴很容易理解,如果從1-10中選擇5個數,那麼只需要從1-9中產生乙個4個數的樣本,然後再加上第五個數即可了:

function sample(m, n)

if m = 0 then

return the empty set

else

s := sample(m - 1, n - 1)

t := randint(1, n)

if t is not in s then

insert t in s

else

insert n in s

return s

隨機化演算法之取樣問題

一 簡單的隨機抽樣 乙個總體的個數為n,如果通過逐個抽取的方法從中抽取 乙個樣本,且每次抽取時各個個體被抽到的概率相等,則這樣的抽樣為簡單的隨機抽樣。例如,從含有6個個體的總體中抽取乙個容量為2的樣本,則在抽樣過程 中某個個體a被抽到的概率是多少?2 6 1 第一次a被抽中 1 6 2 第一次未被抽...

基於matlab的隨機取樣計算法

對於線性規劃而言,有著成熟且有效的方法,而對於非線性整數規劃而言,沒有通解,儘管限制變數為整數而增加了難度,然而整數解為有限個,於是可以用列舉法求解方案。當然在乙個自變數維度很大和取值範圍很寬的情況下,企圖用窮舉法計算最優值是不現實的,但是根據概率理論可知,完全可以得出乙份滿意解。下面是matlab...

SQL 隨機抽取樣本

想要在sql隨機抽採樣本數,隨機從總樣本中抽取1000個樣本,儲存在table name表中 create table table name as 建立乙個表table name select b.from select rand as index name,a.from table name a ...