水庫取樣 隨機數生成

2021-09-11 19:39:51 字數 1512 閱讀 4874

本文所說的均為偽**,**實現根據自己習慣語言編寫.

隨機數是不同隨機試驗的結果。它在不同統計領域均有廣泛地應用,比如從統計樣本中抽取一定數量的個體。產生隨機數有多種不同的方法,而這些方法被稱為隨機數生成器。隨機數的性質是等概率,不可**,例如最簡單隨機數整數生成器求模運算。 偽**見如下

`生成(0,n)的隨機數`

任意輸入乙個整數z

隨機數r則等於 z % n 的求模

結果r則是所求的隨機數

對應python中的randint(0,n)的函式

這種方法產生的數一定是0,n範圍內,且每個數字出現的概率取決於z。因為我們無法判斷輸入的數z的取值範圍,所以生成器生成的結果滿足隨機數的性質,等概率,不可**。

構造屬於特定的隨機數生成器。首先要有基礎的隨機數生成器,也即是rand(),我們會根據這個基礎生成器rand()構造出我們特定需要的隨機數生成器,以下是幾個隨機生成器的應用:

目前有一基礎的隨機函式rand6(), 它可以產生0-6的隨機整數。要求產生1-10的隨機數:

方法一

r = 0

r = rand6() //生成隨機數

if r >= 5 : //若r大於》5

do while true

else

r = r+1 //範圍是1-5

return r //範圍1-10

方法二根據奇偶性,因為任何的整數都能通過0,1表示, 而0000-1111可以表示為0-16的整數。rand6()生成數的奇偶性不是等概率的,很明顯奇數是1,3,5,偶數是0,2,4,6。在這裡,我們剔除6,在進行下一步:

bin_str = "" //step

count = 0

do while (count < 5)

return binstr2int(bin_str)+1 //0,1字串轉成10進製整數

若返回值大於10, 則需要重新在來

2.抽取個體數量為k個

3.隨機數產生器

偽**如下

for i in (1,2,...,n):

do if i <= k :

tmp[i] = arrary[i]

else: // i > k

m = rand(1, i) // 產生0, i-1 範圍的隨機數。參考應用一

if m < k :

tmp[m] = arrary[i]

then

這個演算法的好處是複雜度為o(n)+常數時間, 主要根據當前資料的大小而定。

原理是:

當前k個元素進來,不需考慮,因為i始終小於k;

當i>=k時,此時元素面臨兩種情況,進來並替換前k個元素中的其中乙個;不進來。我們分析以下兩種情況的概率,說明它符合隨機生成器的性質等概率,不可**;

隨機生成隨機數

現畫乙個command命令按鈕,進行貼上。private sub command1 click show me scale 0,0 18,8 me.auto redraw true me.draw mode 2 circle 3,4 3,vb red me.auto redraw false lin...

隨機數生成

原型 void srand unsigned seed 用法 srand和rand 配合使用產生偽隨機數序列。rand函式在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽隨機數序列都是一樣的。sr...

生成隨機數

1 生成num位數驗證碼 用於簡訊驗證功能 public static random rand new random public static string getcode int num result,s k return result random r new random 建立乙個隨機數生成...