游戏开发论坛

 找回密码
 立即注册
搜索
楼主: soulzero

[讨论] 求教一个装备精练+10的概率问题!数值高手请帮忙看看

[复制链接]

7

主题

227

帖子

227

积分

中级会员

Rank: 3Rank: 3

积分
227
发表于 2009-6-2 16:36:00 | 显示全部楼层

Re:求教一个装备精练+10的概率问题!数值高手请帮忙看看

等级不下降情况 60%成功率
等级10矿石需求 10/0.6 = 50/3  = 17个
等级下降情况(不考虑下降到0不能下降情况)   60%成功率
升级到10需要 10*5 个矿石。 考虑下降到0 不下降情况 这个数值接近50个

12

主题

124

帖子

243

积分

中级会员

Rank: 3Rank: 3

积分
243
发表于 2009-6-29 16:19:00 | 显示全部楼层

Re:求教一个装备精练+10的概率问题!数值高手请帮忙看看

如果单级成功率为40%,失败了降2级,那又该如何算?

11

主题

903

帖子

914

积分

高级会员

Rank: 4

积分
914
发表于 2009-7-5 23:56:00 | 显示全部楼层

Re: Re:求教一个装备精练+10的概率问题!数值高手请帮忙看

xiahj: Re:求教一个装备精练+10的概率问题!数值高手请帮忙看看

如果单级成功率为40%,失败了降2级,那又该如何算?


自己写或者找个程序写模拟器
输入成功率,失败后如何处理,升级次数
然后跑十万次,看各种情况下的分布

2

主题

118

帖子

136

积分

注册会员

Rank: 2

积分
136
发表于 2009-7-9 08:50:00 | 显示全部楼层

Re:求教一个装备精练+10的概率问题!数值高手请帮忙看看

出题人把第二题放在第一题后面 这很奇怪

8

主题

96

帖子

98

积分

注册会员

Rank: 2

积分
98
发表于 2009-7-17 12:01:00 | 显示全部楼层

Re:求教一个装备精练+10的概率问题!数值高手请帮忙看看

这个问题可以用“吸收态的马尔科夫模型”来解答,精炼等级一共有11种(从+0到+10),它们之间的转移概率都已经给定了,比如以第一个问题为例,其转移矩阵P是

0.4        0.6        0        0        0        0        0        0        0        0        0
0.4        0        0.6        0        0        0        0        0        0        0        0
0        0.4        0        0.6        0        0        0        0        0        0        0
0        0        0.4        0        0.6        0        0        0        0        0        0
0        0        0        0.4        0        0.6        0        0        0        0        0
0        0        0        0        0.4        0        0.6        0        0        0        0
0        0        0        0        0        0.4        0        0.6        0        0        0
0        0        0        0        0        0        0.4        0        0.6        0        0
0        0        0        0        0        0        0        0.4        0        0.6        0
0        0        0        0        0        0        0        0        0.4        0        0.6
0        0        0        0        0        0        0        0        0        0        1

可以算出其基础矩阵(fundamental matrix)N为(为了显示美观,这里只取2位小数,实际上可以用matlab算出十几位后)
4.91         4.87         4.80         4.71         4.56         4.34         4.01         3.52         2.78         1.67
3.25         4.87         4.80         4.71         4.56         4.34         4.01         3.52         2.78         1.67
2.14         3.20         4.80         4.71         4.56         4.34         4.01         3.52         2.78         1.67
1.39         2.09         3.14         4.71         4.56         4.34         4.01         3.52         2.78         1.67
0.90         1.35         2.03         3.04         4.56         4.34         4.01         3.52         2.78         1.67
0.57         0.86         1.29         1.93         2.89         4.34         4.01         3.52         2.78         1.67
0.35         0.53         0.79         1.19         1.78         2.67         4.01         3.52         2.78         1.67
0.21         0.31         0.46         0.70         1.04         1.56         2.35         3.52         2.78         1.67
0.11         0.16         0.24         0.37         0.55         0.82         1.23         1.85         2.78         1.67
0.04         0.07         0.10         0.15         0.22         0.33         0.49         0.74         1.11         1.67

这里给个自己写的matlab代码:
clear;
A = xlsread('enhance.xls');
B=A(1:10,1:10);
M1=(eye(10)-B)^(-1);
xlswrite('M1.xls', M1)

然后这个基础矩阵的第一行和就是平均需要的矿石数(计算结果是40.1734152991583)。至于为什么可以这么算,在论坛上表达数学公式太麻烦了,所以没法这里科普,但一些随机过程高级教材里都会有论述,这个方法很有一般性,省却普通概率方法的巨大麻烦。人民邮电出的图灵原版教材的《随机过程高级教程》有这方面的论述

第二个问题和第一个实质是一样的,只是转移矩阵不一样,计算结果是16.6666666666667

12

主题

124

帖子

243

积分

中级会员

Rank: 3Rank: 3

积分
243
发表于 2009-7-28 15:24:00 | 显示全部楼层

Re:求教一个装备精练+10的概率问题!数值高手请帮忙看看

自己写程序算上一通宵也能知道答案,但是我想知道数学计算方法.

0

主题

2

帖子

4

积分

新手上路

Rank: 1

积分
4
QQ
发表于 2009-8-1 21:36:00 | 显示全部楼层

Re:求教一个装备精练+10的概率问题!数值高手请帮忙看看

楼主说“平均”的含义就是求数学期望。
如果失败不掉级,用古典概率方法直接求就行了。就题目而论题目,最简单的就是1颗宝石“平均”相当于升1×0.6 + 0×0.4=0.6级,升10级就需要10/0.6=16.667。前面已经有同学给出答案了。精确些的公式我是这样推的:
1)        题目的意思即是求升10级恰好需要10,11,12,…,n-1,n颗宝石概率,这些概率再分别乘以所需的宝石数,即求其数学期望。
2)        我们看n个宝石升级序列(O表示成功,×表示失败):
×××OOOO××××………O
只要O的数目达到10个就ok了。并且最后一个格必须是O。这样的序列组合是数目是C(n-1, 9),所以恰好需要n颗宝石的概率就是(p表示成功的概率):
P (n)= C(n-1, 9)×( p^10 )×( (1-p)^(n-10) ) ,  n>=10
这是个无穷数列,从n=10开始,计算该数列和为1,说明我们所计算的事件是一个完备空间,可以肯定没有算错哈。
3) 其数学期望为:
        E = 10&#215(10) + 11×P(11) + 12×P(12)……
算得结果为16.667。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        第二题的思路是受到25楼的荒原开导才知道可以这样做的,所以专门去看了相关的教科书恶补了下。荒原给出了开始和结果,中间的部分我把自己的理解给出,节省有兴趣的但无相关知识的人学习时间哈。
        先利用第一题的方法估计一下上限。E = 10 / ( P×0.6+( -1×0.4) ) = 50。该期望值最多不超过50,因为按照这个公式的话,装备降到0级还可以继续下降到-1,-2级,如此的话就需要更多的宝石来补正了。所以上限为50。可以作为结果是否正确的大致估算。
        该题是有一个反射壁和一个吸收壁的马尔可夫过程。我们可以在数轴上假设0为装备0级,10为装备10级,有一个点s在0-10之间游动。每次可以移动一格,有60%的概率向右走,有40%的概率向左走,碰到0会反弹,遇到10就被吸收了。
        接下来该需要了解转移矩阵的意思。参看25楼给出的第一个矩阵图:
0.4        0.6        0        0        0        0        0        0        0        0        0
0.4        0        0.6        0        0        0        0        0        0        0        0
0        0.4        0        0.6        0        0        0        0        0        0        0
0        0        0.4        0        0.6        0        0        0        0        0        0
0        0        0        0.4        0        0.6        0        0        0        0        0
0        0        0        0        0.4        0        0.6        0        0        0        0
0        0        0        0        0        0.4        0        0.6        0        0        0
0        0        0        0        0        0        0.4        0        0.6        0        0
0        0        0        0        0        0        0        0.4        0        0.6        0
0        0        0        0        0        0        0        0        0.4        0        0.6
0        0        0        0        0        0        0        0        0        0        1
转移矩阵P的每一行,每一列代表0,1,2…10装备等级状态。对于某个点,比如第2行第3列位置其值为0.6,表示的是s原来处在处在装备等级状态1的位置,下一次会游动到装备等级2的位置的概率为0.6。再如第2行第4列位置其值为0,即表示从等级1游动到等级3的概率为0(显然的,因为每次只能移动一格)。P^n代表的游走n步后,从状态i转移到状态j的概率。
        再来了解禁忌概率矩阵。就本题而论,就是把转移矩阵中的吸收态(装备等级10)去掉后所剩余的状态再组成一个矩阵R。
0.4        0.6        0        0        0        0        0        0        0        0
0.4        0        0.6        0        0        0        0        0        0        0
0        0.4        0        0.6        0        0        0        0        0        0
0        0        0.4        0        0.6        0        0        0        0        0
0        0        0        0.4        0        0.6        0        0        0        0
0        0        0        0        0.4        0        0.6        0        0        0
0        0        0        0        0        0.4        0        0.6        0        0
0        0        0        0        0        0        0.4        0        0.6        0
0        0        0        0        0        0        0        0.4        0        0.6
0        0        0        0        0        0        0        0        0.4        0
本题中禁忌概率矩阵即是那些从i游走到j而不经过吸收态(等级10)的概率矩阵(这样不严谨,将就先吧)。
从禁忌概率推算出从某一状态i到吸收态的数学期望矩阵公式如下:
        E = R + R^2 + R^3 + … + R^n
该矩阵E中的第一行之和即是从等级0升到等级10的期望,第二行之和是从等级1升到等级10的期望,依次类推。
3.9130         4.8695         4.8044         4.7067         4.5603         4.3407         4.0114         3.5176         2.7770         1.6662
3.2464         3.8696         4.8044         4.7068         4.5603         4.3408         4.0115         3.5177         2.7771         1.6662
2.1353         3.2030         3.8045         4.7068         4.5604         4.3409         4.0116         3.5178         2.7772         1.6663
1.3946         2.0919         3.1379         3.7069         4.5605         4.3410         4.0117         3.5179         2.7773         1.6663
0.9008         1.3512         2.0269         3.0404         3.5606         4.3411         4.0119         3.5180         2.7774         1.6664
0.5716         0.8574         1.2862         1.9293         2.8941         3.3412         4.0120         3.5182         2.7775         1.6665
0.3522         0.5283         0.7924         1.1887         1.7830         2.6747         3.0121         3.5183         2.7776         1.6665
0.2059         0.3088         0.4632         0.6949         1.0424         1.5636         2.3455         2.5184         2.7776         1.6666
0.1084         0.1625         0.2438         0.3657         0.5486         0.8230         1.2345         1.8518         1.7777         1.6666
0.0433         0.0650         0.0975         0.1463         0.2194         0.3292         0.4938         0.7407         1.1111         0.6666
        本题求第一行的和结果为:40.1669。
        具体如何得出这个公式大家自己也看看去哈,其中有些证明步骤我也还没搞清楚。
        以下用lua写的计算代码(在学这个就顺手用了^_^),写的差,不入法眼莫生气。


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
function w(n,k)
        if (n<k or n==0) then
                print("wrong input w")
                return -1
        end
        local num=1
        for v=k, n do
        num = num*v
        end
        return num
end
--组合公式
function c(n,k)
        if (n<k or n==0) then
                print("wrong input c")
                return -1
        end
        if(n==k) then
        return 1
        end
        local num = w(n,n-k+1)/w(k,1)
        return num
end

--2个n阶矩阵相乘
function matrixmult(matrixa,matrixb, nv)
        local out = {}
        local i, j, k = 1, 1, 1
                while(i <= nv) do
                        out = {}
                                while(j <= nv) do
                                        out[j] = 0
                                                while(k <= nv) do
                                                        out[j] = out[j] + matrixa[k]*matrixb[k][j]
                                                        k = k + 1
                                                end
                                        j = j + 1
                                        k = 1
                                end
                        i = i + 1
                        j = 1
                end
        return out
end

--矩阵的n次幂
function matrixpow(matrix, nv, n)
        local out = matrix
        local i = 1
                while(i < n) do
                        out = matrixmult(out, matrix, nv)
                        i = i + 1
                end
        return out
end

--2个矩阵相加
function matrixadd(matrixa, matrixb, nv)
                local out = {}
                local i, j = 1, 1
                        while(i <= nv) do
                                out = {}
                                while(j <= nv) do
                                        out[j] = matrixa[j] + matrixb[j]
                                        j = j + 1
                                end
                                i = i + 1
                                j = 1
                        end
        return out
end


--构造n阶单位矩阵
function imatrix(nv)
        local im = {}
        local i, j = 1, 1
                while(i <= nv) do
                        im = {}
                                while(j <= nv) do
                                        if(j~=i) then
                                                im[j] = 0
                                        else
                                                im[j] = 1
                                        end
                                        j = j + 1
                                end
                        i = i + 1
                        j = 1
                end
return im
end

--构造n阶零矩阵
function zeromatrix(nv)
        local out = {}
        local i, j = 1, 1
        while(i <= nv) do
                out = {}
                while(j <= nv) do
                        out[j] = 0
                        j = j + 1
                end
                i = i + 1
                j = 1
        end
        return out
end

--n阶矩阵转置,nv是输入矩阵维度
function tranmatrix(matrix, nv)
        local out = imatrix(nv)
        local i, j = 1, 1
                while(i <= nv) do
                                while(j <= nv) do
                                        out[j] = matrix[j]
                                        j = j + 1
                                end
                        i = i + 1
                        j = 1
                end
        return out
end

--判断一个状态不属于目标态(一般指吸收态)
function isset(args,a)
        for i, v in ipairs(args) do
                if (a == v) then
                        return false
                end
        end
        return true
end


--截取矩阵的某一子集,即除去某些状态集后剩余的状态组成的概率转移矩阵,也就是禁忌概率矩阵
function clipmatrix(v, matrix, ...)  --v是输入矩阵维度
        local out = {}
        local i, j = 1, 1
        local i1, j1 = 1, 1
                while (i <= v) do
                        if(isset(arg, i)) then
                                out[i1] ={}
                                        while(j <= v) do
                                                if(isset(arg, j)) then
                                                        out[i1][j1] = matrix[j]
                                                        j = j + 1
                                                        j1 = j1 + 1
                                                else
                                                        j = j + 1
                                                end
                                        end
                                j = 1
                                i = i + 1
                                j1 = 1
                                i1 = i1  + 1
                        else
                                j = 1
                                i = i + 1
                        end
                end
return out
end

--------------------------------------------------------------------------------------
--题目2:升级失败,装备等级下降一级(下限为0),共10级,每次升级成功概率60%

--------------------------------------------------------------------------------------
--增加一个宝石,可能达到一个新的状态,也可能回到过去的状态,各个状态之间可以相互转移
--该状态空间是有限的,目标是从某一初态到某一终态的首达概率。应用到马尔可夫链的知识。

--构造n=1状态的转移矩阵,一个吸收壁,一个反射壁
m = {}
m[1] =         {0.4,        0.6,        0,        0,        0,        0,        0,        0,        0,        0,        0,}
m[2] =         {0.4,        0,        0.6,        0,        0,        0,        0,        0,        0,        0,        0,}
m[3] =         {0,        0.4,        0,        0.6,        0,        0,        0,        0,        0,        0,        0,}
m[4] =         {0,        0,        0.4,        0,        0.6,        0,        0,        0,        0,        0,        0,}
m[5] =         {0,        0,        0,        0.4,        0,        0.6,        0,        0,        0,        0,        0,}
m[6] =         {0,        0,        0,        0,        0.4,        0,        0.6,        0,        0,        0,        0,}
m[7] =         {0,        0,        0,        0,        0,        0.4,        0,        0.6,        0,        0,        0,}
m[8] =         {0,        0,        0,        0,        0,        0,        0.4,        0,        0.6,        0,        0,}
m[9] =         {0,        0,        0,        0,        0,        0,        0,        0.4,        0,        0.6,        0,}
m[10] = {0,        0,        0,        0,        0,        0,        0,        0,        0.4,        0,        0.6,}
m[11] = {0,        0,        0,        0,        0,        0,        0,        0,        0,        0,        1,}

--计算转移矩阵m的9,10,11......n-1,n次幂,分别求出使用n+1颗宝石能够冲到11级的概率并不能如
--题1计算数学期望就可得出答案。这里的各部分概率是转移概率,当n为固定值时,同一行的概率才会构成完备空
--间,不同的n,取某一位置的值的概率组合无意义(我们需要的是首次到达11级的概率,而转移概率计算了n步中
--可能到达过11级的次数)。实际上随着转移矩阵的自相乘次数越来越多将会发现吸收态的转移概率越来越高,本
--题的吸收态即11级处,num[11]列的值逐渐接近1,意味着n趋向无穷大时,吸收态的概率将为1。
--转移矩阵m的n次幂即表示经过n次转移(使用n颗宝石)后,下一次到达各个参数状态(1-11级装备)的转移概率
--nums[1][x]表示使用n+1颗宝石能够从1级升到x级的概率
test = clipmatrix(11, m, 11)  --禁忌概率矩阵
function E(n)
        local out = zeromatrix(10)
        local i = 1
        while(i <= n)do
                out = matrixadd(matrixpow(test, 10, i), out, 10)
                i = i + 1
        end
        return out
end

nums = E(200)
for i=1, 10 do
                print(nums[1], nums[2], nums[3], nums[4], nums[5], nums[6], nums[7], nums[8], nums[9], nums[10])
end

k = 1
for i=1, 10 do
        k = nums[1] + k
end
print(k)  --k为40.1669  此即为从零级升到10级平均需要的宝石数

一年了,有个错误...改之...
E = R^0 + R + R^2 + R^3 + … + R^n

1

主题

240

帖子

240

积分

中级会员

Rank: 3Rank: 3

积分
240
发表于 2009-8-1 21:49:00 | 显示全部楼层

Re: Re:求教一个装备精练+10的概率问题!数值高手请帮忙看

kele0120: Re:求教一个装备精练+10的概率问题!数值高手请帮忙看看

情况一,失败不需要降强化等级。那么装备的升级几率就是60%。
强化一级需要的次数就等于 1/60%。算出来是1...


大哥第二种情况方法这好。

如果题目是:

该游戏中装备最高精练+10,每次精练装备需要一颗矿石,如果精练成功装备+1,如果失败装备-1,最低到装备初始状态(可以认为是+0),失败时装备不会消失,石头则无论成功或者失败都会被消耗掉。

请问:
假设精练成功率为40%,那么
1.统计一下精练一件+10的装备“平均”(注意是平均)需要多少矿石?
2.如果精练失败装备不-1,只是消耗掉矿石那么相应的平均精练一件+10的装备需要多少矿石?

注意  精练成功率为40%

大哥,套用你的思想方法,会是什么结果呢?

0

主题

94

帖子

106

积分

注册会员

Rank: 2

积分
106
发表于 2009-11-10 11:41:00 | 显示全部楼层

Re:求教一个装备精练+10的概率问题!数值高手请帮忙看看

找个程序做模拟,啥都有了。。。除非你们程序死烦你你,不给你写

4

主题

20

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2009-11-12 15:46:00 | 显示全部楼层

Re:求教一个装备精练+10的概率问题!数值高手请帮忙看看

回27楼的:
3.9130 4.8695 4.8044 4.7067 4.5603 4.3407 4.0114 3.5176 2.7770 1.6662求和后=40.1669
我却sum成:39.1668(与27楼的结果有出入)
而且与25楼的4.91 4.87 4.80 4.71 4.56 4.34 4.01 3.52 2.78 1.67的此行不相同(sum后40.17,符合)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-15 16:08

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表