2018年百度Java后端面试题算法题

本文介绍了一种通过组合多个随机事件来实现概率平衡的算法。利用01组合的等概率特性,设计了能输出0和1等概率的随机数生成器,并进一步推广到输出n个不同数值等概率的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、给一个函数,返回0和1,概率为p和1-p,请你实现一个函数,使得返回0、1的概率一样

分析:这是典型的随机概率发生器的案例,我们先用数学知识来分析一下,函数返回0出现的概率为p,返回1出现的概率为1-p,如果单独返回1位0或1位1,那么没有办法实现返回0和1的概率一样。所以我们需要更大的位数来分析,因为存在返回0和1两种情况,我们把位数定为2,那么组合出来的信息就有2*2=4种:

00 --->概率为p*p

01 --->概率为p*(1-p)

10 --->概率为(1-p)*p

11 --->概率为(1-p)*(1-p)

四种情况中我们发现 01和10的两种组合返回的概率都是p*(1-p),那么我们可以认为这两种情况下返回0和返回1的概率是相等的。接下来就是要想办法使得00和11两种组合返回的概率相等。在Java中我们可以使用Random函数来产生随机数,再使用组合的方法保证概率一样

代码如下:

import java.util.Random;

public class RandomEquals {
	public static int random() {
		Random random = new Random(25);
		int i,j;

		i = random.nextInt();
		j = random.nextInt();

		int result;
		while(true) {
			if(i==0 && j==1) {
				result = 0;
				break;
			}else if(i==1 && j==0) {
				result = 1;
				break;
			}else {
				continue;
			}
			
		}
		return result;
	}
}

扩展一下:

已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,
使得它构造01的概率均为1/2;构造一个发生器,使得它构造123的概率均为1/3...
构造一个发生器,使得它构造123...n的概率均为1/n,要求复杂度最低。

解答:

n=2,认为01表示010表示1,等概率,其他情况放弃

n=3,认为001表示1010表示2100表示3,等概率,其他情况放弃

n=4,认为0001表示10010表示20100表示31000表示4,等概率,其他情况放弃

思想都是一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值