// 有一个函数fun能返回0和1两个值,返回0和1的概率都是1/2,
// 问怎么利用这个函数得到另一个函数fun2,使fun2也只能返回0和1,且返回0的概率为0.3,返回1的概率为0.7。
#include <stdio.h>
#include <stdlib.h>
int fun()
{
return rand()%2;
}
int myfun()
{
int sum;
int i;
while (true)
{
sum=0;
for (i=0; i<4; i++)
{
sum += (fun()<<i);
}
if (sum>=10)
continue;
return (sum<=2)?0:1;
}
}
int main()
{
// 测试fun函数:产生10000个数,计算总和,是否接近500
int sum=0;
int i;
for (i=0; i<10000; i++)
{
int k=fun();
sum += k;
}
printf("sum(fun *10000): %d\n", sum);
//测试自己的myfun函数
sum=0;
for (i=0; i<10000; i++)
{
int k=myfun();
sum += k;
}
printf("sum(myfun *10000): %d\n", sum);
return 0;
}
结果:
PS:这样,16个数中只能用0-9,丢弃了6个数,丢弃的概率还是挺大的。考虑下32,只丢弃最后两个数。具体性能比较需要计算才能确定。
【2】
类似的代码:
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();
}
(来自)http://blog.csdn.net/nathan_wz/article/details/8045566
【3】rand5均匀产生0-4之间的随机数,用rand5构造rand7,以产生0-6之间的随机数,均匀分布。
// Use rand5(), to generate rand7() (with the same probability),类似解法
#include <stdio.h>
#include <stdlib.h>
int fun()
{
return rand()%5;
}
int myfun()
{
int sum;
while (true)
{
int sum=fun()*5+fun();
if (sum>=21)
continue;
return sum%7;
}
}
int main()
{
// 测试fun函数:产生10000个数,计算0,1,2,3,4的个数
int sum[5]={0};
int i;
for (i=0; i<10000; i++)
{
sum[fun()]++;
}
printf("0-4: \n");
for (i=0; i<5; i++)
{
printf("%d: %d\n",i,sum[i]);
}
//测试自己的myfun函数
int sum1[7]={0};
for (i=0; i<10000; i++)
{
sum1[myfun()]++;
}
printf("0-6: \n");
for (i=0; i<7; i++)
{
printf("%d: %d\n",i,sum1[i]);
}
return 0;
}
结果: