史莱姆自爆问题

Posted weiyinfu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了史莱姆自爆问题相关的知识,希望对你有一定的参考价值。

知乎链接

草丛里蹦出一只史莱姆,它每天会做以下一件事(等概率):自爆;什么也不做;分裂成两只;分裂成三只

问题:史莱姆最终全部自爆完的概率是多少?

编程复杂度太大,因为史莱姆的个数是指数上升的。

import numpy as np

N = 10  # 天数
M = 4  # 每天的分裂情况数
C = (M - 1) ** N + 1  # 最多多少只


def go(a, ind, cnt, n, left):
    if ind == M - 1:
        cnt[ind] = n - sum(cnt[:M - 1])
        c = int(np.sum(cnt * np.arange(M)))
        if c < C:
            a[c] += (1 / M) ** n
        return
    for i in range(left + 1):
        cnt[ind] = i
        go(a, ind + 1, cnt, n, left - i)
    cnt[ind] = 0


def get(n):
    # n只变多的概率
    a = np.zeros(C)
    cnt = np.zeros(M)
    go(a, 0, cnt, n, n)
    return a


def main():
    a = np.zeros(C)
    a[1] = 1
    for i in range(N):
        b = np.zeros(C)
        for j in range(C):
            if a[j] > 0:
                b += get(j) * a[j]
        a = b
        print('day', i, a[0])


main()

这道题其实应该用方程思想:设一只史莱姆爆炸的概率是p,$p=frac{1}{4}+frac{p}{4}+frac{p^2}{4}+frac{p^3}{4}$,p=sqrt(2)-1或者1或者-sqrt(2)-1(舍)

当每次等概率做2件事,保持现状和爆炸时,一定会灭亡。
当每次等概率做3件事,爆炸、保持现状、分裂繁殖时,一定会灭亡。
只有当每次等概率做4件事,爆炸、保持现状、一个变两个、一个变三个时,才有可能避免灭亡。

以上是关于史莱姆自爆问题的主要内容,如果未能解决你的问题,请参考以下文章

TypeScripte 资料

我想在列表中的游戏对象消失的同时删除列表元素

测试

matlab练习程序(克莱姆法则解方程)

三个在线神站

[golang] 数据结构-地精排序