投骰子连续两次是 6就停止,求投掷的次数的期望 & 系列变形(字节跳动面试)

发现字节特别喜欢考概率题和开放题,倒是不怎么考 LeetCode了(算法岗)

1. 投骰子连续两次是 6就停止,求投掷的次数的期望

解法1:动态规划 dp
听面试官说可以用 动态规划,但是没有思路…

看到其他大佬写的方法:

dp1(n) = 1/6 *1/6 * 5/6 [1-dp2(n-3)]
dp2(n) = dp2(n-1) + dp1(n)

其中 dp1 表示第几次停止的概率,dp2 表示前 n 次停止的概率
求出前三个初始值,就可以迭代了

解法2:使用马尔科夫链求解。

记“当已经掷出x次1朝上时,直至出现连续2次1朝上所需的期望次数”为E(x)。则有:
E(0) = 1 + 5/6 * E(0) + 1/6 * E(1)
E(1) = 1 + 5/6 * E(0) + 1/6 * E(2)
E(2) = 0
解释:由E(0)状态可转换成E(0),E(1)状态(转换成E(2)状态的概率为零),E(0)转换成E(0)是指下一次投掷1不正面朝上,所以概率为5/6,E(0)转换成E(1)是指下一次投掷1正面朝上,所以概率为1/6,最前面的1表示一定投掷一次(然后状态会发生改变)。E(1),E(2)同理。

由上面三个式子可得:

E(0) = 42
表示初始状态——已经掷出0次1朝上时,直至出现连续2次1朝上所需的期望次数为E(0) = 42次。

2. 投硬币连续两次是正面就停止,求投掷的次数的期望

解0:
假设期望次数是E,我们开始扔,有如下几种情况:

• 扔到的是反面,那么就要重新仍,所以是0.5*(1 + E)
• 扔到的是正面,再扔一次又反面了,则是0.25*(2 + E)
• 扔到两次,都是正面,结束,则是0.25*2

所以递归来看 E = 0.5*(1 + E) + 0.25*(2 + E) + 0.25*2,解得E = 6

解1:
a[i]表示抛i次,最后一次是反面,而且这i次没有出现连续正面的情况的概率大小
f[i]表示正好抛i次,出现连续两次正面的概率大小
LEN越大,越逼近期望值

链接:https://www.nowcoder.com/questionTerminal/bfa0b0796e1847c8b36f96ad1614d4d0
来源:牛客网

int main()
{
    const int LEN = 100;
    double a[LEN], f[LEN];
    a[0] = 1;
    a[1] = 0.5;
    a[2] = 0.5;
    double E = 0.0;
    for (int i = 3; i < LEN; ++i) {
        a[i] = 0.5*a[i - 2] + 0.125*a[i - 3];
    }
    for (int i = 2; i < LEN; ++i) {
        f[i] = 0.25*a[i - 2];
        E += i*f[i];
    }
    cout<<E<<endl; 
    return 0;
}

解2:
在这里插入图片描述
解3:
在这里插入图片描述
解4:
在这里插入图片描述

3. 抛硬币直到出现连续N次正面为止的期望

在这里插入图片描述
参考:抛硬币 直到连续出现两次字为止

其他抛硬币问题系列变形

参考:几道抛硬币问题

参考:

  1. 抛的硬币直到连续出现两次正面为止,平均要扔多少次


题主本硕机械专业,自学转互联网 算法岗成功,获得阿里、字节、美团、华为等 15+ offer
后续会在公众号 「苏学算法」分享各类学习笔记、面试经验,感兴趣的可以关注一波 😊 😊 😊~

在这里插入图片描述

在面对掷骰子问题时,生成函数提供了一种强大的工具来表达和计算概率。根据《IOI2018:掷骰子问题的生成函数解法探析》中的方法,你可以通过定义一个生成函数,其中每一项的系数代表了掷出特定点数的概率。 参考资源链接:[IOI2018:掷骰子问题的生成函数解法探析](https://wenku.csdn.net/doc/6412b5eabe7fbd1778d44d9f?spm=1055.2569.3001.10343) 为了计算连续两次掷出相同点数的概率期望值,可以先定义一个生成函数G(x),其中x的指数表示掷出的点数,系数表示对应点数出现的概率。例如,假设一个六面骰子的掷出结果是均匀分布的,则生成函数可以写作: G(x) = (x^1 + x^2 + x^3 + x^4 + x^5 + x^6) / 6 随后,我们将生成函数G(x)平方,因为我们要计算两次掷出相同点数的情况: G(x)^2 = ((x^1 + x^2 + x^3 + x^4 + x^5 + x^6) / 6)^2 在这个乘积中,相同指数的项相加后,对应的系数即为连续两次掷出相同点数的概率。通过将上述表达式展开并合并同类项,我们可以得到连续两次掷出1点到6点的概率。 最后,通过和所有概率,我们得到连续两次掷出相同点数的总概率。对于期望值的计算,我们需要将每一种相同点数的概率与该点数相乘,然后进行和。这样,我们可以得到连续两次掷出相同点数的概率期望值。 这个方法展示了如何将复杂的概率问题转化为生成函数的运算,进而通过代数操作得精确解。对于想要深入理解并实践此类问题的读者来说,《IOI2018:掷骰子问题的生成函数解法探析》是一份不可多得的参考资料,它不仅提供了掷骰子问题的生成函数解法,还广泛涵盖了其他相关算法和数学概念的应用。 参考资源链接:[IOI2018:掷骰子问题的生成函数解法探析](https://wenku.csdn.net/doc/6412b5eabe7fbd1778d44d9f?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值