以傻子坐飞机问题论新手如何解算法题
概率论没学好,这题数学方法求解失败了,所以选择了用程序模拟,当是玩玩。
对模拟现实事件的代码,很多新手会觉得茫然,其实只要把大问题拆成小问题,一切就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次,计算成功次数。
把每个方法实现,代码就完成了。把大问题拆解成小问题,问题就可以迎刃而解。就象画画,新手总是直接画鼻子画眼,会画的都是,先勾勒个轮廓。看到很多新手遇到复杂问题会很茫然,希望我的话能对他们有所帮助。
代码:
14 楼 jasongreen 2007-07-27 jindw 写道
吧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());}}