最近學習程式設計珠璣,看到隨機取樣演算法,很不錯,這裡也整理下:
首先來看乙個簡單的取樣演算法,這裡假定在不考慮重複的情況下,從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 ...