//没登陆

欢迎您来到凯恩之角,奈非天!

帖子:148

符文:33

发表于 2012-9-4 04:42:16 |显示全部楼层
本帖最后由 fruitsalad 于 2012-9-4 08:34 编辑

我们来计算一下得到无敌海景的概率吧,看看暴雪有多么坑爹。

(UPDATE: 原来一些数据算错了,导致结论大了一倍,也就是说现实更加悲剧了。。。现已更正)

首先是海景别墅的定义,词缀的选择以及结论。具体计算步骤在附录中。


由于每种物品对应的词缀都是不同的,因此每种物品得到海景的概率也是不同的。我选择了符文剑作为研究对象,原因是:1.所有的职业都可以使用这种武器。2.攻击速度高,相对低速武器更有价值。符文剑的词缀见表1,符文剑总共可能有40种不同的词缀(http://db.d.163.com/tw/item/rune-sword.html#!&page=2&best=0),但是有些词缀是互斥的(见http://bbs.d.163.com/thread-172045881-5-1.html,第66楼),而对于黄色稀有物品,前缀与后缀是没有区别的(比如可以有6个前缀的物品,或6个后缀的物品,见http://bbs.d.163.com/thread-172062055-1-1.html)。

海景的定义:我计算了2种海景(至少我觉得是海景哈哈)出现的概率
1)海景厕所:拥有如下属性:
        + 伤害(物理或其他6种元素伤害),且词缀等级>=60,P=66.67%*0.5=33.33% (注1)
        + 伤害百分比,且词缀等级>=60,P=57.14%
        + 暴击伤害,且词缀等级>=60,P=66.67%
        + 孔,任何可能的词缀登记,P=100.00%
2)海景别墅,拥有如下属性(注2):
        + 伤害(物理或其他6种元素伤害),且词缀等级>=60,P=66.67%*0.5=33.33% (注1)
        + 伤害百分比,且词缀等级>=60,P=57.14%
        + 暴击伤害,且词缀等级>=60,P=66.67%
        + 孔,任何可能的词缀登记,P=100.00%
        + 击回,且词缀等级>=62,P=40.00%

注1:P表示在物品拥有这个词缀的前提下,随机到符合要求的属性的概率。由于伤害词缀的随机范围很大,因此我把概率再除以2,排除了随到坑爹值的情况。
注2:海景别墅有5个属性,那么4属性的符文剑随机到的概率肯定是0了。


计算结果

最终计算得到的概率值(每个数据基于一亿次模拟)

6属性稀有物品是海景厕所的概率 = 0.02590%
6属性稀有物品是海景别墅的概率 = 0.00064%
5属性稀有物品是海景厕所的概率 = 0.00752%
5属性稀有物品是海景别墅的概率 = 0.00007%
4属性稀有物品是海景厕所的概率 = 0.00127%
4属性稀有物品是海景别墅的概率 = 0%

因此,可以得到如下结论(假定一个稀有物品随机到6/5/4属性的概率分别是10%/30%/60%,参考http://bbs.d.163.com/thread-172297108-1-1.html):
1. 当你获得一个稀有63级符文剑,鉴定出来是海景厕所的概率是 0.02590%*10% + 0.00752*30% + 0.00127*60% = 0.00561%,即大概两万分之一多一点
2. 当你获得一个稀有63级符文剑,鉴定出来是海景别墅的概率是 0.00064%*10% + 0.00007*30% + 0.00000*60% = 0.00009%,即大概百万分之一少一点
3. 当你存了337个63级符文剑,鉴定出来全部是垃圾的概率是 (1-0.00561%)^337 = 98.13%(注意海景别墅是海景厕所的子集),换句话说,直播的朋友你们最后全部悲剧应该妥妥的

PS
1. 个人感觉实际海景的掉率应该比我计算的要高,那么可能暴雪每个词缀出现的概率是不等的,由于没有相关数据,因此无法计算了。但是无论如何,我认为改变不了坑爹的本质。
2. 你平均只需打出17825件63级装备就可以有一个海景厕所噢!亲!努力把!
3. 这里的概率仅仅适用于符文剑,不过我估计其他物品也好不到哪里去。个人认为暴雪应该把掉率提高100倍才合理。

*****************************************************************************************

附录A 概率计算的假设
1.由于暴雪没有给出每个词缀的分布概率,也没有人统计过,这里我假设所有词缀出现的概率是相同的
2.假定每个词缀的不同子属性出现的概率也是相同的,其变量服从均匀分布(比如,增加最小伤害的词缀一共有6个子类,分别是
        +(27-33) 最小傷害
        +(22-34) 最小傷害
        +(17-35) 最小傷害
        +(13-36) 最小傷害
        +(10-13) 最小傷害
        +9 最小傷害
这里假定这6种情况出现的概率是相同的)。

在具体计算时,由于有些词缀是互斥的,因此似乎无法使用经典概率来计算了,这是个无放回并且概率不相等的随机抽样问题。不知道是否有高手有办法计算出。我退而求其次,使用计算机模拟来计算概率。我使用的是java,代码在下面。根据词缀的互斥关系,进一步把40个词缀分为21组,问题即变为每个物品是从这21个组中随机抽取n个概率不同的词缀。

举个例子,比如我要一个2属性的符文剑(当然是蓝色的)随机到增加伤害这个词缀(可能是物理/冰冻/毒/火/秘法/神圣/电7种之一),以及增加伤害百分比词缀,那么概率是
P = P(第一个词缀是伤害,第二个词缀是伤害百分比)+P(第一个词缀是伤害百分比,第二个词缀是伤害)= (7/40)*(1/33)+(1/40)*(7/39) = 0.979%
直接使用经典概率(而非枚举法)我感觉好像没有办法计算。


附录B
==========================================================
表1 符文剑的40种可能的词缀和组别(与java代码对应)
----------------------------------------------------------
GroupID        Group Name        詞綴名        屬性
0        BONUS_VS_ELITES        穿刺        對精英怪的傷害提高 (3-6)%
1        MIN_DAMAGE        蹂躪之        +(27-33) 最小傷害
2        MAX_DAMAGE        末日之        +(27-33) 最大傷害
3        DAMAGE                死亡之        +(143-286) 最小傷害 / +(191-381) 最大傷害
3                        冰霜之        +(40-201)-(93-459) 點冰寒傷害
3                        瘡傷之        +(66-316)-(154-727) 點毒素傷害
3                        燃燒之        +(66-316)-(154-727) 點火焰傷害
3                        懲擊之        +(66-316)-(154-727) 點神聖傷害
3                        虛空之        +(66-316)-(154-727) 點秘法傷害
3                        轟鳴之        +(66-316)-(154-727) 點電擊傷害
4        IAS                征伐        攻擊速度提高 (10-11)%
5        BLEED                奪血        (10.0-35.0)% 機率引發流血,在 5 秒內造成 (825-1628)-(826-3256) 點傷害
6        DAMAGE_PCNT        兇殘        +(41-50)% 傷害
7        CD_PCNT                絕憫        爆擊傷害提高 (66-100)%
8        EFFECT_ON_HIT        極北        擊中有 (1.0-2.6)% 機率造成冰冷
8                        絕凜之        擊中有 (1.0-2.6)% 機率造成凍結
8                        麻痺之        擊中有 (1.0-2.6)% 機率造成定身
8                        恐懼之        擊中有 (1.0-2.6)% 機率造成恐懼
8                        碎擊        擊中有 (1.0-2.6)% 機率造成擊退
8                        威懾之        擊中有 (1.0-2.6)% 機率造成昏迷
8                        催眠        擊中有 (1.0-2.6)% 機率造成目盲
8                        支配        擊中有 (1.0-2.6)% 機率造成緩速
9        LIFE_ON_HIT        殘虐之        擊中生命恢復 +(658-959)
10        LIFE_ON_KILL        恐懼之        擊殺生命恢復 +(1972-2878)
11        LIFE_STEAL        奪血        +(2.80-3.00)% 生命竊取
12        STRENGTH        強襲之        +(170-200) 力量
13        DEXTERITY        痛楚之        +(170-200) 敏捷
14        INTELLIGENCE        卓見之        +(170-200) 智力
15        VITALITY        榮耀之        +(170-200) 體能
16        DOUBLE_PROPERTY        殺戮        +(45-150) 力量 / +(45-150) 敏捷
16                        典範        +(45-150) 力量 / +(45-150) 智力
16                        冷酷        +(45-150) 力量 / +(45-150) 體能
16                        神奇        +(45-150) 敏捷 / +(45-150) 智力
16                        果敢        +(45-150) 敏捷 / +(45-150) 體能
16                        卓絕        +(45-150) 智力 / +(45-150) 體能
17        WIZARD_MAGIC        狂法之        能量旋風的爆擊機率提高 (2-8)%
17                        喚法之        魔法飛彈造成的傷害提高 (5-14)%
18        UNBREAKABLE        不壞        無視耐久度的毀損
19        SOCKET        鑲孔        鑲孔(1)
20        LEVEL_REQ        勇氣之        等級需求降低 (2-18)
==========================================================





附录C java代码

public class Test1 {

        public static void main(String[] args) throws Exception {
                test10();
        }
        
        static void test10() {
                // this test is used to calculate the probability of a good item in Diablo III
                double probability_multiplier = 0.0;
                int N = 100000000;
                Item_Sword item = new Item_Sword();
                int count = 0;
               
                // 6 property
                System.out.print("6 property item, 4 required properties (%): ");
                probability_multiplier = 0.33333*0.57143*0.66667;
                item.setTotalProperty(6);
                item.resetGoodAffix();
                item.setGoodAffix(Item_Sword.DAMAGE);
                item.setGoodAffix(Item_Sword.DAMAGE_PCNT);
                item.setGoodAffix(Item_Sword.CD_PCNT);
                item.setGoodAffix(Item_Sword.SOCKET);
                count = 0;
                for (int i=0; i<N; ++i)
                        if (item.generateItem())
                                count++;
                System.out.println(probability_multiplier*100*count/N);

                System.out.print("6 property item, 5 required properties (%): ");
                probability_multiplier = 0.33333*0.57143*0.66667*0.4;
                item.setTotalProperty(6);
                item.resetGoodAffix();
                item.setGoodAffix(Item_Sword.DAMAGE);
                item.setGoodAffix(Item_Sword.DAMAGE_PCNT);
                item.setGoodAffix(Item_Sword.CD_PCNT);
                item.setGoodAffix(Item_Sword.SOCKET);
                item.setGoodAffix(Item_Sword.LIFE_ON_HIT);
                count = 0;
                for (int i=0; i<N; ++i)
                        if (item.generateItem())
                                count++;
                System.out.println(probability_multiplier*100*count/N);

                // 5 property
                System.out.print("5 property item, 4 required properties (%): ");
                probability_multiplier = 0.33333*0.57143*0.66667;
                item.setTotalProperty(5);
                item.resetGoodAffix();
                item.setGoodAffix(Item_Sword.DAMAGE);
                item.setGoodAffix(Item_Sword.DAMAGE_PCNT);
                item.setGoodAffix(Item_Sword.CD_PCNT);
                item.setGoodAffix(Item_Sword.SOCKET);
                count = 0;
                for (int i=0; i<N; ++i)
                        if (item.generateItem())
                                count++;
                System.out.println(probability_multiplier*100*count/N);

                System.out.print("5 property item, 5 required properties (%): ");
                probability_multiplier = 0.33333*0.57143*0.66667*0.4;
                item.setTotalProperty(5);
                item.resetGoodAffix();
                item.setGoodAffix(Item_Sword.DAMAGE);
                item.setGoodAffix(Item_Sword.DAMAGE_PCNT);
                item.setGoodAffix(Item_Sword.CD_PCNT);
                item.setGoodAffix(Item_Sword.SOCKET);
                item.setGoodAffix(Item_Sword.LIFE_ON_HIT);
                count = 0;
                for (int i=0; i<N; ++i)
                        if (item.generateItem())
                                count++;
                System.out.println(probability_multiplier*100*count/N);

                // 4 property
                System.out.print("4 property item, 4 required properties (%): ");
                probability_multiplier = 0.33333*0.57143*0.66667;
                item.setTotalProperty(4);
                item.resetGoodAffix();
                item.setGoodAffix(Item_Sword.DAMAGE);
                item.setGoodAffix(Item_Sword.DAMAGE_PCNT);
                item.setGoodAffix(Item_Sword.CD_PCNT);
                item.setGoodAffix(Item_Sword.SOCKET);
                count = 0;
                for (int i=0; i<N; ++i)
                        if (item.generateItem())
                                count++;
                System.out.println(probability_multiplier*100*count/N);

                System.out.print("4 property item, 5 required properties (%): ");  // this should always be 0
                probability_multiplier = 0.33333*0.57143*0.66667*0.4;
                item.setTotalProperty(4);
                item.resetGoodAffix();
                item.setGoodAffix(Item_Sword.DAMAGE);
                item.setGoodAffix(Item_Sword.DAMAGE_PCNT);
                item.setGoodAffix(Item_Sword.CD_PCNT);
                item.setGoodAffix(Item_Sword.SOCKET);
                item.setGoodAffix(Item_Sword.LIFE_ON_HIT);
                count = 0;
                for (int i=0; i<N; ++i)
                        if (item.generateItem())
                                count++;
                System.out.println(probability_multiplier*100*count/N);

        }
        
}

class Item_Sword {
        
        static int TOTAL_AFFIX = 40;
        static int TOTAL_GROUP = 21;
        
        // array location definitions
        public static final int BONUS_VS_ELITES =        0;
        public static final int MIN_DAMAGE =                1;
        public static final int MAX_DAMAGE =                2;
        public static final int DAMAGE =                        3;
        public static final int IAS =                                4;
        public static final int BLEED =                                5;
        public static final int DAMAGE_PCNT =                6;
        public static final int CD_PCNT =                        7;
        public static final int EFFECT_ON_HIT =                8;
        public static final int LIFE_ON_HIT =                9;
        public static final int LIFE_ON_KILL =                10;
        public static final int LIFE_STEAL =                11;
        public static final int STRENGTH =                        12;
        public static final int DEXTERITY =                        13;
        public static final int INTELLIGENCE =                14;
        public static final int VITALITY =                        15;
        public static final int DOUBLE_PROPERTY =        16;
        public static final int WIZARD_MAGIC =                17;
        public static final int UNBREAKABLE =                18;
        public static final int SOCKET =                        19;
        public static final int LEVEL_REQ =                        20;
        
        static final double[] P_ORIGINAL = {
                1.0/TOTAL_AFFIX,        // BONUS_VS_ELITES
                1.0/TOTAL_AFFIX,        // MIN_DAMAGE
                1.0/TOTAL_AFFIX,        // MAX_DAMAGE
                7.0/TOTAL_AFFIX,        // DAMAGE
                1.0/TOTAL_AFFIX,        // IAS
                1.0/TOTAL_AFFIX,        // BLEED
                1.0/TOTAL_AFFIX,        // DAMAGE_PCNT
                1.0/TOTAL_AFFIX,        // CD_PCNT
                8.0/TOTAL_AFFIX,        // EFFECT_ON_HIT
                1.0/TOTAL_AFFIX,        // LIFE_ON_HIT
                1.0/TOTAL_AFFIX,        // LIFE_ON_KILL
                1.0/TOTAL_AFFIX,        // LIFE_STEAL
                1.0/TOTAL_AFFIX,        // STRENGTH
                1.0/TOTAL_AFFIX,        // DEXTERITY
                1.0/TOTAL_AFFIX,        // INTELLIGENCE
                1.0/TOTAL_AFFIX,        // VITALITY
                6.0/TOTAL_AFFIX,        // DOUBLE_PROPERTY
                2.0/TOTAL_AFFIX,        // WIZARD_MAGIC
                1.0/TOTAL_AFFIX,        // UNBREAKABLE
                1.0/TOTAL_AFFIX,        // SOCKET
                1.0/TOTAL_AFFIX                // LEVEL_REQ
        };
        
        private boolean[] GOOD_AFFIX = new boolean[TOTAL_GROUP];
        public void setGoodAffix(int field) {
                GOOD_AFFIX[field] = true;
        }
        public void resetGoodAffix() {
                this.GOOD_AFFIX = new boolean[TOTAL_GROUP];
        }
        
        private boolean[] AFFIX_USED = new boolean[TOTAL_GROUP];
        private void resetAffixUsed() {
                for (int i=0; i<this.AFFIX_USED.length; ++i)
                        this.AFFIX_USED = false;
        }
        
        private int TOTAL_PROPERTY = 6;
        public void setTotalProperty(int n) {
                this.TOTAL_PROPERTY = n;
        }
        
        // probability table array
        private double[] P_CUL_TABLE = new double[TOTAL_GROUP];
        
        public boolean generateItem() {
                this.resetAffixUsed();
                for (int i=0; i<this.TOTAL_PROPERTY; ++i) {
                        this.updateProbabilityTables();
                        double seed = Math.random();
                        // choose an affix from probability table
                        for (int j=0; j<this.P_CUL_TABLE.length; ++j)
                                if (!this.AFFIX_USED[j] && seed<=this.P_CUL_TABLE[j]) {
                                        this.AFFIX_USED[j] = true;
                                        break;
                                }
                }
                // check if its a good item or not
                for (int i=0; i<this.GOOD_AFFIX.length; ++i)
                        if (this.GOOD_AFFIX && !this.AFFIX_USED)
                                return false;
                return true;
        }
        
        private void updateProbabilityTables() {
                // calculate total probability
                double total_prob = 0.0;
                for (int i=0; i<this.AFFIX_USED.length; ++i) {
                        if (!this.AFFIX_USED)
                                total_prob += P_ORIGINAL;
                        P_CUL_TABLE = total_prob;
                }
                // update probability tables
                for (int i=0; i<this.AFFIX_USED.length; ++i) {
                        P_CUL_TABLE = P_CUL_TABLE/total_prob;
                }
        }
}

}


点评

*milosun_2010  此帖必火+1  发表于 2012-9-11 09:24
景天他爸  此贴必火  发表于 2012-9-11 07:37
明明忘记了  高数贴+10086  发表于 2012-9-10 17:47
茶硕士  虽不明但觉厉,我不再相信爱情了  发表于 2012-9-10 17:14
死蜜蜂  大学里我是学这玩意的,还好没往这方面发展  发表于 2012-9-10 16:16
再次归来  一个刷子游戏还搞的比传奇掉率还低,怎么玩,传奇可是网络游戏 这你吗一单机  发表于 2012-9-10 13:20
已有 1 人评分符文 收起 理由
丸子猎奇 + 5 高数贴+10086

总评分:  符文 + 5   查看全部评分

帖子:1607

符文:4

2#
还可以                  

点评

亚服大法  很好,这不是技术贴,这是高数贴。  发表于 2012-9-4 13:46
发表于 2012-9-4 04:47:45 |显示全部楼层

帖子:99

符文:7

3#
技术贴。。。。。。。。。
发表于 2012-9-4 05:27:33 |显示全部楼层

帖子:75

符文:0

4#
so....? 玩还是不玩?
发表于 2012-9-4 05:48:10 来自凯恩之角App |显示全部楼层

帖子:117

符文:0

5#
超级海景的概率比六合彩,大乐透头奖的概率还低啊,我要有这人品不如买彩票了,中个几亿RMB直接换真海景房了

点评

iceseal  楼下错了,是比被雷劈中100次的几率还低  发表于 2012-9-11 11:48
V心靈風暴V  错!!!超级海景最多也就千万分之一,就还是有可能的东西。福/体 彩那可是比被雷劈死的几率还低,完全可以说是没可能的彩票。  发表于 2012-9-10 23:05
哈尼十三  同意+1...我个人认为所有中奖的人都是内定的,偶尔放点新闻加炒作。  发表于 2012-9-10 18:20
别开枪是我  你想多了 玩福彩的话 估计你一辈子都中不了几亿  发表于 2012-9-10 16:11
发表于 2012-9-4 05:51:33 |显示全部楼层

帖子:516

符文:4

6#
   看下面的数据吓尿了。
发表于 2012-9-4 05:53:28 |显示全部楼层
夕莙.你可知道我有多爱你..  出国前半年..
佳敏.你可知道我有多爱你..  出国后一年..
小毛.你可知道我有多爱你..  出国后三年..
宇婷.我爱上你了..                 出国第五年..
永远不要相信自己多爱一个人..
在没有经历过时间和距离前.

帖子:773

符文:41

7#
技术帖,支持lz,格式标准
发表于 2012-9-4 06:15:59 来自凯恩之角App |显示全部楼层

帖子:429

符文:3

8#
拜楼主啊。。。完全打破了我的美梦。。。
发表于 2012-9-4 07:08:20 来自凯恩之角App |显示全部楼层
[armory]http://eu.battle.net/d3/en/profile/mooou-2456/hero/43484071[/armory]
你比他才高八斗,他比你命好十分。

帖子:389

符文:4

9#
撸主学编程的吧,语言老规范了,牛逼
发表于 2012-9-4 07:20:56 来自凯恩之角App |显示全部楼层
[url=http://db.d.163.com/tw/calculator/barbarian.html#WXSVkR!bVZ!aaccca][/url]

帖子:532

符文:20

10#
靠,不看内容就给楼主跪了
发表于 2012-9-4 07:26:32 来自凯恩之角App |显示全部楼层
[armory]http://us.battle.net/d3/en/profile/chiseen-3284/hero/69322880[/armory]

帖子:848

符文:21

11#
飘逸的饭团 发表于 2012-9-4 07:20
撸主学编程的吧,语言老规范了,牛逼

楼上东北的吧?大碴味老浓啊 。

点评

飘逸的饭团  哈哈,我哈尔滨的,哈哈  发表于 2012-9-4 20:21
发表于 2012-9-4 07:27:48 |显示全部楼层
[armory]http://kr.battle.net/d3/zh/profile/smileofcloud-1409/hero/38481863[/armory]

帖子:751

符文:5

12#
D2的高级符文掉率比这低多了 我还不是打到了?

点评

lucci  问题是D2的高级符文不是你唯一的选择.没有高级符文你也一样能轻松打怪 而D3......海景是你唯一的选择.  发表于 2012-9-10 12:45
mnjiaxinwen  签名很写实啊!!!  发表于 2012-9-10 10:27
发表于 2012-9-4 07:32:46 |显示全部楼层
[armory]http://tw.battle.net/d3/zh/profile/alone-3902/hero/407784[/armory]

帖子:940

符文:24

13#
人人都天天出,还叫海景啊
发表于 2012-9-4 07:35:08 来自凯恩之角App |显示全部楼层
新赛季愿景:太古家妮1/1 远古影套4/6 女朋友0/1
[armory]http://hero.d.163.com/hero/cn/%E8%8A%B1%E9%97%AE%E6%9F%B3-5192/39300333[/armory]

帖子:156

符文:2

14#
确实如此。。。
发表于 2012-9-4 07:47:38 |显示全部楼层

帖子:35

符文:0

15#
这数据吓死人
















发表于 2012-9-4 07:48:53 |显示全部楼层
您需要登录后才可以回帖 登录 | 注册网易通行证