我想知道如何使用「基本操作」爲隨機變量建模。我知道的唯一隨機函數,至少對於C來說,是rand()
,以及用於播種的srand
。可能存在某些在線的軟件包,但可以說我想自己實現它。我不知道是否還有其他非常常見的隨機函數,但如果不是,只需堅持使用rand()
和C語言。如何模擬隨機變量?
rand()
允許我從0
到RAND_MAX
僞隨機生成int
。然後我可以使用mod
在某個範圍內獲得int
。我可以下mod 2
選擇一個標誌並獲得負數。我也可以使用rand()/RAND_MAX
來模擬間隔(0,1)
中的值,並將其轉換爲Uniform(a,b)
。
但是我不確定的是,如果我可以擴展它來模擬任何概率分佈,以及在什麼時候我必須擔心精度,特別是在處理無窮大和無理概率時。此外,這種方法非常粗糙,所以我想知道更多使用基本工具的標準方法(如果有的話)。
一個簡單的例子:
我有隨機變量X
使得Pr(X = 1)=1/pi
和Pr(X=0)=1-1/pi
。由於pi
不合理,因此我會近似得到1/pi
與rand()
的概率,並選擇X=1
,如果我從0
獲得int
到Round(RAND_MAX*1/pi)
。所以這是近似兩次,一次爲pi
,另一次爲四捨五入。
有沒有更好的方法?人們會怎樣去模擬一些更復雜的事情,如間隔(0,infinity)
上的連續隨機變量,或者一個離散的隨機變量,它們在可數無限集合上具有無理概率。我的方法仍然有效嗎?還是我不得不擔心舍入錯誤?
編輯:另外如何僞隨機性而不是隨機性的0改變的事情,我將如何解釋這些變化?
*「我可以使用mod在一定範圍內獲得int。」*不可以。你必須劃分,而不是使用mod,因爲你只會使用較低的位,而這些位較少隨機。 – spectras
@spectras無法保證'rand'的質量。因此,不確定低位或高位是否「更隨機」。事實是,如果你需要任何種類的真正的隨機分配,「蘭特」是一個不行。哦,除非輸入範圍是除數的整數倍,否則div和mod都不適用。 – Olaf
我覺得這個問題或多或少需要一個演講作爲答案。這並沒有錯,並且已經有這樣的講座史詩般的案例被傳遞,但它也(從字面上)要求很多。 :) – unwind