算法:等概率算法,Math.random()随机数

该博客介绍了如何在不修改f1()函数的情况下,通过一系列步骤将等概率返回[1,5]的函数转化为等概率返回[1,7]的函数。主要思路包括将f1()映射到[0,1],利用二进制表示7,然后平摊概率到[0,6],最后加1得到[1,7]的等概率结果。" 133629253,20038466,Win10错误0xc0000000e:启动故障排除指南,"['Windows', '操作系统', '故障排除', '启动修复', '硬件检查']

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

面试题:从1-5随机到1-7随机

题目

给一个函数f1()等概率返回[1,5]之间的整数。在不修改f1()函数的情况下,如何借助f1()函数实现[1,7]等概率随机函数?

已知 f1()函数代码如下:

// 等概率返回[1,5] ,固定函数,不允许修改
public static int f1() {
   
   
    return (int) (Math.random() * 5) + 1;
}

解题思路

1、根据f1()函数可以得到等概率返回 [0,1]之间的函数;

2、然后把7转换成二进制为:111 ; 根据等概率[0,1] 表示二进制可以得到等概率[0,7]

3、把出现7的概率平摊到[0,6]上,得到等概率[0,6]

4、等概率[0,6] + 1 ,得到等概率[1,7]

充分利用二进制,可以得到[0,n]之间的等概率; [0, n-x]等概率可以利用平摊法。即[0,n] 生成的数字>n-x , 重新生成即可

步骤如下:

1、根据 f1() 得到等概率返回 [0,1] 的函数 f2()

 // 等概率返回[0,1]
public static int f2() {
   
   
    int ans = 0;
    do {
   
   
        ans = f1();
    } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值