根据已知随机数产生器,构造新的随机数产生器

来源:互联网 发布:域名dns更改 编辑:程序博客网 时间:2024/05/06 12:54
http://blog.csdn.net/nathan_wz/article/details/8045566

(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(共七个串)
否则,递归,重新来过

代码:

[cpp] view plaincopy
  1. int func2()  
  2. {  
  3.   int n = 0;  
  4.   int v0 = fun();  
  5.   int v1 = fun();  
  6.   int v2 = fun();  
  7.   int v3 = fun();  
  8.   n |= v0;  
  9.   n |= (v1<<1);  
  10.   n |= (v2<<2);  
  11.   n |= (v3<<3);  
  12.   if(n <= 2) return 0;//0, 1, 2  
  13.   else if(n <= 9) return 1;//3, 4, 5, 6, 7, 8, 9  
  14.   return func2();  
  15. }  
说明:
 生成的四个数放到n的低四位上 
 0000 对应十进制数 0
0001 对应十进制数 1
...
1111对应十进制数15
16个串对应0 ~ 15共16个整数 

(2)Use rand5(), to generate rand7() (with the same probability),类似解法
[cpp] view plaincopy
  1. int rand7()  
  2. {  
  3. v1 = rand5();  
  4. v2 = rand5();  
  5. t = v2*5 + v1;//看作两位5进制数,数值范围0~24之间 25 = 3 * 7 + 4  
  6. t: [0, 2] return 0;  
  7. t: [3, 5] return 1;  
  8. t: [6, 8] return 2;  
  9. t: [9, 11] return 3;  
  10. t: [12, 14] return 4;  
  11. t: [15, 17] return 5;  
  12. t: [18, 20] return 6;  
  13. t: [21, 24] return rand7();  

0 0
原创粉丝点击