概率论没学好,这题数学方法求解失败了,所以选择了用程序模拟,当是玩玩。
对模拟现实事件的代码,很多新手会觉得茫然,其实只要把大问题拆成小问题,一切就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次,计算成功次数。
把每个方法实现,代码就完成了。把大问题拆解成小问题,问题就可以迎刃而解。就象画画,新手总是直接画鼻子画眼,会画的都是,先勾勒个轮廓。看到很多新手遇到复杂问题会很茫然,希望我的话能对他们有所帮助。
代码:
对模拟现实事件的代码,很多新手会觉得茫然,其实只要把大问题拆成小问题,一切就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次,计算成功次数。
把每个方法实现,代码就完成了。把大问题拆解成小问题,问题就可以迎刃而解。就象画画,新手总是直接画鼻子画眼,会画的都是,先勾勒个轮廓。看到很多新手遇到复杂问题会很茫然,希望我的话能对他们有所帮助。
代码:
import java.util.Random;
/**
* 2007-7-15 下午05:36:02
*/
/**
* @author <a href="mailto:guileen@gmail.com">桂健雄</a>
* @since 2007-7-15
*/
public class FoolSit {
boolean[] sited=new boolean[100];
int emptySitCount = 100;
void trySit(int sitNum){
if(sited[sitNum]){
ranSit();
}
else{
sit(sitNum);
}
}
/**
*
* @param sitNum
*/
void sit(int sitNum){
sited[sitNum]=true;//坐下来
emptySitCount -- ;
}
/**
* 随便坐个位子
*
*/
void ranSit(){
int x=rand.nextInt(emptySitCount);
int c = -1;
for(int i=0;i<100;i++){
if(!sited[i]){
c++;
if(c==x){
sit(i);
break;
}
}
}
}
/**
*
* @return 第一百个人是否做到了自己的位子
*/
boolean testSit(){
//初始化
for(int i=0;i<100;i++){
sited[i] = false;
}
emptySitCount = 100;
//傻子,随便坐个位置
ranSit();
for(int i=1;i<99;i++){
trySit(i);
}
return sited[99];
}
public static void main(String[] args) {
FoolSit f = new FoolSit();
int success = 0;
for(int i=0;i<1000000;i++){
if(f.testSit())
success++;
}
double rate = (double)success/1000000;
System.out.println("run:10000 times,success:"+success+" rate:"+rate);
}
Random rand= new Random();
}