根据已知0-1均匀随机数产生器,构造新的随机数产生器

// 有一个函数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;
}


结果:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值