【題目一】已知隨機函式rand(),以p的概率產生0,以1-p的概率產生1,現在要求設計乙個新的隨機函式newrand(), 使其以1/n的等概率產生1~n之間的任意乙個數。
思路:可以通過已知隨機函式rand()產生等概率產生0和1的新隨機函式rand(),然後呼叫k(k為整數n的二進位制表示的位數)次rand()函式,得到乙個長度為k的0和1序列,以此序列所形成的整數即為1--n之間的數字。注意:從產生序列得到的整數有可能大於n,如果大於n的話,則重新產生直至得到的整數不大於n。
【題目二】給定乙個函式rand5(),該函式可以隨機生成1-5的整數,且生成概率一樣。現要求使用該函式建構函式rand7(),使函式rand7()可以隨機等概率的生成1-7的整數。
思路:利用5*(rand5()-1)等概率生成0、5、10、15、20五個數字,再由5*(rand5()-1)+rand5()函式等概率生成1-25之間的數字,然後將1~25的數字對3取膜,將其中的1-21對映成1-7,丟棄22-25。
擴充套件:給定乙個函式rand()能產生0到n-1之間的等概率隨機數,問如何產生0到m-1之間等概率的隨機數。(需要考慮m和n的大小關係,**如下)
int random(int m , int n)
return k/(max/n);
}
【題目三】已知rand()等概率隨即產生0~n-1之間的數,如何產生如下概率的數,0出現1次,1出現2次,...,n-1出現n次
思路:**如下
int random(int size)
}
題目四:
思路:
非等概率隨機演算法
自己做了乙個非等概率的隨機演算法的封裝,然後後面人的可以借用。probability是概率,最好是兩位小數,然後返回1的概率是probability,返回0的概率是1 probability 如果是三元組或者是多元組,多返回幾個值就可以了 int notequalprobability float ...
海量資料等概率選取問題
1 問題定義可以簡化如下 在不知道檔案總行數的情況下,如何從檔案中隨機的抽取一行,並且每行被抽中的概率相等?首先想到的是我們做過類似的題目嗎?當然,在知道檔案行數的情況下,我們可以很容易的用c執行庫的rand 函式隨機的獲得乙個行數,從而隨機的取出一行,但是,當前的情況是不知道行數,這樣如何求呢?我...
海量資料等概率選取問題
1 問題定義可以簡化如下 在不知道檔案總行數的情況下,如何從檔案中隨機的抽取一行,並且每行被抽中的概率相等?首先想到的是我們做過類似的題目嗎?當然,在知道檔案行數的情況下,我們可以很容易的用c執行庫的rand 函式隨機的獲得乙個行數,從而隨機的取出一行,但是,當前的情況是不知道行數,這樣如何求呢?我...