码迷,mamicode.com
首页 > 其他好文 > 详细

史莱姆自爆问题

时间:2018-06-15 22:38:11      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:port   turn   numpy   问题:   python   SQ   +=   思想   int   

知乎链接

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

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

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

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件事,爆炸、保持现状、一个变两个、一个变三个时,才有可能避免灭亡。

史莱姆自爆问题

标签:port   turn   numpy   问题:   python   SQ   +=   思想   int   

原文地址:https://www.cnblogs.com/weiyinfu/p/9189035.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!