读书人

以傻子坐飞机有关问题论新手怎么解算法

发布时间: 2012-10-26 10:30:58 作者: rapoo

以傻子坐飞机问题论新手如何解算法题
概率论没学好,这题数学方法求解失败了,所以选择了用程序模拟,当是玩玩。
对模拟现实事件的代码,很多新手会觉得茫然,其实只要把大问题拆成小问题,一切就ok了。
PS:边编码,边思考,前后不超过5分钟。嘻嘻。
不废话,看题:

100个人排队乘坐有100个座位的飞机,正常情况时每个都都会对号入坐,但是,第一个上飞机的是个傻子,他随机坐了一个位子,接下来的人上飞机时,如果自己座位被人坐了就会随机找个座位坐下,否则就坐自己坐位。问题:最后一个上飞机的人坐到自己座位的概率是多少??

第一步:建一个项目,一个类,废话。
第二步:有几个东西需要表示
a, 100个位子。把他编号为0~99。常量
b, 100个人。把他们编号为0~99。常量
b, 哪个人坐哪个位子。人和位子的编号一一对应。常量
c, 位子上有没有坐人。在程序中定义一个 boolean sited[]=new boolean[100];变量

第三步:有几个动作要表示
a, 坐到某个位子上,写个方法,sit(int sitNum);
b, 随便坐个位子,写个方法,randSit(),
c, 尝试坐到某个位子上,被坐了就随便坐个位子,写个方法,trySit(int num);
PS:我是先写上方法的定义,后面才写代码的,要首先从宏观的角度思考问题,然后再深入细节。

第四步:求解
a, 模拟100个人上飞机的过程,并返回最后一个人是不是坐到他自己的位子
b,计算1000000次,计算成功次数。

把每个方法实现,代码就完成了。把大问题拆解成小问题,问题就可以迎刃而解。就象画画,新手总是直接画鼻子画眼,会画的都是,先勾勒个轮廓。看到很多新手遇到复杂问题会很茫然,希望我的话能对他们有所帮助。
代码:

 


吧jasongreen的例子改了一下,抽出了常量99(100)
结果发现,输出结果,不受这个坐位数量影响。
这个明显是不对的。

jasongreen的程序有问题?我改错了?package com.maodajun.javaeye2;import java.util.Iterator;import junit.framework.TestCase;public class FoolByPlanTest extends TestCase {private FoolByPlan foolbyplan ;public static void main(String[] args) {junit.textui.TestRunner.run(FoolByPlanTest.class);}protected void setUp() throws Exception {super.setUp();foolbyplan = new FoolByPlan();}protected void tearDown() throws Exception {System.out.println( foolbyplan.passenger);System.out.println(foolbyplan.plan);super.tearDown();}/* * Test method for 'com.maodajun.javaeye2.FoolByPlan.findBlock(int, int)' */public void testFindBlock() {assertTrue(foolbyplan.findBlock(0,"11"));assertFalse(foolbyplan.findBlock(0,"12"));}public void testRadomBlock() {foolbyplan.radomBlock("5");foolbyplan.radomBlock("5");foolbyplan.radomBlock("5");Iterator it = foolbyplan.plan.iterator();String str ;int count = 0 ;while(it.hasNext()){str = it.next().toString();if(str.equals("5")){count++;}}assertEquals(3, count);}public void testRadomBlockTooLarge() {try{for(int i = 0 ; i< FoolByPlan.PLANSIZE+1 ; i ++){foolbyplan.radomBlock("5");}fail();}catch(RuntimeException e){assertEquals("Out of List",e.getMessage());}}public void testFoolBlock(){//foolbyplan.foolBlock();//怎么测试呢?}public void testLastBlockRight(){foolbyplan.findBlock(0,"0");assertTrue(foolbyplan.lastBlock());}public void testLastBlockWrong(){foolbyplan.findBlock(foolbyplan.PLANSIZE-1,"0");assertFalse(foolbyplan.lastBlock());}}
14 楼 jasongreen 2007-07-27 jindw 写道

吧jasongreen的例子改了一下,抽出了常量99(100)
结果发现,输出结果,不受这个坐位数量影响。
这个明显是不对的。

jasongreen的程序有问题?我改错了?

这个结果的确是不受座位数量影响的。 15 楼 抛出异常的爱 2007-07-28 是的用我写的程序把常量改一下就可以了。。。
不过有谁能把我写的程序改一下
让傻子不是一号乘客?() 16 楼 jindw 2007-07-28 jasongreen 写道jindw 写道

吧jasongreen的例子改了一下,抽出了常量99(100)
结果发现,输出结果,不受这个坐位数量影响。
这个明显是不对的。

jasongreen的程序有问题?我改错了?

这个结果的确是不受座位数量影响的。

是我想错了,而且我原来那个程序也是错的。

看到gof95的分析,令我豁然开朗,^_^

gof95 写道不是50%吗
傻子坐的位置有3种可能:傻子自己的位置;最后一个人的位置;其他位置
若为1,则return true
若为2,则return false
若为3,则被傻子占了位子的人变成傻子,再次重复这3种可能
而出现1和2的概率是相同的

读书人网 >其他相关

热点推荐