根據已知隨機數產生器,構造新的隨機數產生器(百度)

(1)  有一個函數fun能返回0和1兩個值,返回0和1的概率都是1/2,問怎麼利用這個函數得到另一個函數fun2,使fun2也只能返回0和1,且返回0的概率爲0.3,返回1的概率爲0.7。 

分析:

 Nathan  16:42:59
隨機生成長度爲4的01串
0000~1111每個串出現的概率都爲1/16
Nathan  16:44:28
如果生成的串爲0000 0001 0010之一,則返回0
Nathan  16:45:45
如果生成的串爲0011 0100 0101 0110 0111 1000 1001則返回1(共七個串)
否則,遞歸,重新來過

代碼:

int func2()
{
  int n = 0;
  int v0 = fun();
  int v1 = fun();
  int v2 = fun();
  int v3 = fun();
  n |= v0;
  n |= (v1<<1);
  n |= (v2<<2);
  n |= (v3<<3);
  if(n <= 2) return 0;//0, 1, 2
  else if(n <= 9) return 1;//3, 4, 5, 6, 7, 8, 9
  return func2();
}
說明:

 生成的四個數放到n的低四位上 
 0000 對應十進制數 0
0001 對應十進制數 1
...
1111對應十進制數15
16個串對應0 ~ 15共16個整數 

(2)Use rand5(), to generate rand7() (with the same probability),類似解法
int rand7()
{
v1 = rand5();
v2 = rand5();
t = v2*5 + v1;//看作兩位5進制數,數值範圍0~24之間 25 = 3 * 7 + 4
t: [0, 2] return 0;
t: [3, 5] return 1;
t: [6, 8] return 2;
t: [9, 11] return 3;
t: [12, 14] return 4;
t: [15, 17] return 5;
t: [18, 20] return 6;
t: [21, 24] return rand7();
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章