posted @ 2011-12-16 11:35 漂流的鱼 阅读(90) 评论(0) 编辑
有一道很有意思的题目:三个小伙子同时爱上了一 个姑娘,为了决定他们谁能娶这个姑娘,他们决定用枪进行一次决斗。小李的命中率是30%,小黄比他好些,命中率是50%,最出色的枪手是小林,他从不失 误,命中率是100%。由于这个显而易见的事实,为公平起见,他们决定按这样的顺序:小李先开枪,小黄第二,小林最后。然后这样循环,直到他们只剩下一个 人。那么这三个人中谁活下来的机会最大呢?他们都应该采取什么样的策略?
网上有很多人在讨论但没有一个是经过严格推敲的,我在这里把看法写出来,欢迎大家讨论。
先说策略,肯定是小李和小黄合力把小林打死符合他们两个人的最大化利益,这里不解释,如果有不同意的把你的答案贴出来看与我的答案相比他们2个人的生存率更大。小林肯定是首先对小黄动手因为对他威胁最大。
先计算小林的,比较简单(谁让他成众矢之的):小李第一次没打死他,小黄也没成功,小李第二次还是没打死他,概率为 0.7*0.5*0.7=0.245。
小李和小黄的计算很麻烦,他们两都没把握一次打死对方,导致会多次PK,这里先设置一个简单的情况计算好2者的概率,后面直接引用结果即可。
分解出小题目:小李和小黄PK,小李的命中率是30%,小黄比他好些,命中率是50%,问小李先开枪的情况下生存率如何,小黄先开枪的情况下又如何。解答如下,A)小李先开枪,小李的生存率为0.3+0.7*0.5*0.3+0.7*0.5*0.7*0.5*0.3+0.7*0.5*0.7*0.5*0.7*0.5*0.3+......。解释一下,每一个+号都代表一种情况,第一组是小李一枪就打死了小黄概率为0.3;;第二组是小李没打中(0.7)乘以小黄也没打中(0.5)乘以小李第二轮打死小黄(0.3),所以是0.7*0.5*0.3;;后面一组就是更多一轮的情况,小李生存下来的情况有N多种,越到后面概率越小。根据计算公式,当n<1时有:n+n^2+n^3+n^4+...... = n/(1+n)。可以得出小李的生存率是0.461,小黄是0.539。 B)小黄先开枪与上类似,可算得小黄的生存率为0.5+0.5*0.7*0.5+0.5*0.7*0.5*0.7*0.5+0.5*0.7*0.5*0.7*0.5*0.7*0.5+...... = 0.769,小李是0.231。
好,上面把小问题说清楚了咱们继续讲,对于小黄有这么几种情形,A)小李打死小林,剩下小李小黄PK,小黄先开枪,概率为0.3。 B)小李没打死小林,小黄把小林打死了,小李小黄PK,小李先开枪,概率为0.7*0.5。 套用上面的概率A) 0.3*0.769 ;B) 0.7*0.5*0.539 。 二者合并是0.419
所以最终答案应该是小黄0.419,小林0.245,剩下小李是0.336
为验证答案在计算下小李的,看是否与上面的一致。小李有这么几种情形,A)小李打死小林,剩下小李小黄PK,小黄先开枪,概率为0.3。 B)小李没打死小林,小黄把小林打死了,小李小黄PK,小李先开枪,概率为0.7*0.5。 C)小李没打死小林,小黄也没打死小林,小林一枪把小黄毙了,剩下小李只有30%的概率能打死小林,否则就over了。小李生存率为0.7*0.5*0.3 = 0.105 套用上面的概率A) 0.3*0.231 ;B) 0.7*0.5*0.461 C) 0.105。 三者合并是0.336和上面结果一致。
=============================上面的答案是错的,看了devil_lei的评论后有新的概率====================
因为小李可以选择放空枪,这样算法变了:
小林的生存率提高了,变成0.5*0.7=0.35
小黄的压力变大了:0.5*0.539=0.27 (50%的概率把小林打死,然后跟小李PK胜率0.539)
小李的概率也变大了:0.5*0.3 + 0.5*0.461=0.381 (前面一组是跟小林PK,后面一组是跟小黄PK,都是小李先出枪)
呵呵,枪法最差的生存率最高,就是比较阴险,第一枪居然放空枪。
posted @ 2011-12-15 15:35 漂流的鱼 阅读(5152) 评论(52) 编辑
posted @ 2011-10-27 11:29 漂流的鱼 阅读(316) 评论(3) 编辑
前些天使用Jquery.validate插件时遇到这么一个难题:在修改密码的弹出层中使用验证但又不能影响页面上其他区域的验证。翻阅了很多文档(包括官方的)都没有解决方案,现有的解决方案都是解决已知要验证的多个区域,这样的解决方案可看这篇文章(http://www.cnblogs.com/Cheese_Ren/archive/2009/04/30/1447166.html)。但是遇到弹出层里要验证,同时不破坏未知的底层页的验证上面的方法就解决不了(这也是因为asp.net整个页面只有一个form表单造成的)。
我这里提供的方案实际上是个取巧的方法:先将form表单旧的验证规则另存到一个对象中,然后验证当前需要验证的控件,最后在把验证规则替换成第一步中保存好的对象。比如说:网站右上角有个修改密码功能,点击之后是弹出层,里面是输入新密码,用户可以不修改密码直接关闭这个层做别的动作,这时不能影响原有页面的验证。那么可以使用如下的代码:
1 var newSetting = {
2 rules: {
3 txtOldPWD: { required: true },
4 txtNewPWD: { required: true },
5 txtNewPWD2: { required: true }
6 },
7
8 messages: {
9 txtOldPWD: { required: "请输入原密码" },
10 txtNewPWD: { required: "请输入新密码" },
11 txtNewPWD2: { required: "请输入新密码" }
12 }
13 };
14
15 var validator = $('form').validate();
16 var oldSet = { messages: validator.settings.messages, rules: validator.settings.rules };
17 $.extend(validator.settings, newSetting);
18
19 var valid = validator.form();
20 $.extend(validator.settings, oldSet);
21 if (!valid)
22 return false;
由于js中对象是引用类型因此不能直接把$('form').validate()放到变量中,否则后面新规则会一起把该变量的值修改,我这里使用var oldSet = { messages: validator.settings.messages, rules: validator.settings.rules };这样的方式确保创建的是一个新对象。20行代码则是把验证规则替换回去以便保持旧页面验证规则。
上面这段JS应该是在弹出层的提交按钮的click事件中执行才对。
posted @ 2011-08-01 14:21 漂流的鱼 阅读(1331) 评论(0) 编辑
posted @ 2011-07-27 13:51 漂流的鱼 阅读(168) 评论(5) 编辑
