菜牙先生

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

依然是先回顾一下上一章的内容

主要是关于循环语句

这里做一个有关于蒙特卡罗模拟有关的练习

先是一段背景介绍

蒙特卡罗方法通过抓住事物运动的几何数量和几何特征,利用数学方法来加以模拟,

即进行一种数字模拟实验。它是以一个概率模型为基础,按照这个模型所描绘的过程,

通过模拟实验的结果,作为问题的近似解。可以把蒙特卡罗解题归结为三个主要步骤:

构造或描述概率过程;实现从已知概率分布抽样;建立各种估计量。


简单讲就是使用随机数和概率来解决问题,

先使用蒙特卡罗方法来估算π ,画出一个圆的外接正方形

假设圆的半径是1,那么圆的面积就是π,而外接正方形的面积是4,

随便产生一个点落在这个圆内的概率是 圆面积/正方形面积=π/4

编写程序,在正方形内随机产生1000000个点,用numberOfHits表示落在圆内的点

因此,numberOfHits大约是1000000*(π/4),可以近似估算π为4*numberOu

fHits/1000000

程序代码如下:

MonteCarloSimulation
 1 //使用蒙特卡洛方法模拟PI值
2 public class MonteCarloSimulation {
3 public static void main(String[] args) {
4 // TODO Auto-generated method stub
5 final int NUMBER_OF_TRIVALS=10000000;
6 int numberOfHits=0;
7
8 for(int i=0;i<NUMBER_OF_TRIVALS;i++){
9 double x=Math.random()*2.0-1;
10 double y=Math.random()*2.0-1;
11 if(x*x+y*y<=1)
12 numberOfHits++;
13 }
14 double pi=4.0*numberOfHits/NUMBER_OF_TRIVALS;
15 System.out.println("PI is"+pi);
16 }
17 }


GUI(使用确认对话框来实现一个标志值控制的循环)

DataSum
 1 import javax.swing.JOptionPane;
2 public class DataSum {
3
4 public static void main(String[] args) {
5 // TODO Auto-generated method stub
6 int sum=0;
7
8 int option=JOptionPane.YES_OPTION;
9
10 while(option==JOptionPane.YES_OPTION){
11 String dataString =JOptionPane.showInputDialog("请输入一个整数:\n");
12 int data=Integer.parseInt(dataString);
13
14 sum+=data;
15
16 option=JOptionPane.showConfirmDialog(null, "是否继续加入整数 ?");
17 }
18
19 JOptionPane.showMessageDialog(null, "总和为:"+sum);
20 }
21
22 }

接下来进入第五章的内容

之前有用实现过打印素数,这里使用方法来实现

PrimeNumberMethod
 1 public class PrimeNumberMethod {
2
3 public static void main(String[] args) {
4 // TODO Auto-generated method stub
5 System.out.println("The first 50 prime numbers are:");
6 printPrimeNumbers(50);
7 }
8 public static void printPrimeNumbers(int numberOfPrimes){
9 final int NUMBER_OF_PRIMES_PER_LINE=10;
10 int count=0;
11 int number=2;
12 while(count<numberOfPrimes){
13 if(isPrime(number)){
14 count++;
15 if(count%NUMBER_OF_PRIMES_PER_LINE==0){
16 System.out.printf("%-5s\n", number);
17 }
18 else
19 System.out.printf("%-5s", number);
20 }
21 number++;
22 }
23 }
24 public static boolean isPrime(int number){
25 for(int divisor=2;divisor<=number/2;divisor++){
26 if(number%divisor==0){
27 return false;
28 }
29 }
30 return true;
31 }
32 }

使用方法可以减少冗余,提高代码的复用性,比如之前求公约数的那个程序,换成用方法实现

GreatestCommonDivisorMethod
 1 import java.util.Scanner;
2 public class GreatestCommonDivisorMethod {
3
4 public static void main(String[] args) {
5 // TODO Auto-generated method stub
6 Scanner input=new Scanner(System.in);
7
8 System.out.print("请输入第一个整数:");
9 int n1=input.nextInt();
10
11 System.out.print("请输入第二个整数: ");
12 int n2=input.nextInt();
13
14 System.out.println(n1 +" 和 "+n2 +"的最大公约数为: "+gcd(n1,n2));
15 }
16
17 public static int gcd(int n1,int n2){
18 int gcd=1;
19 int k=2;
20 while(k<=n1&&k<=n2){
21 if(n1%k==0&&n2%k==0){
22 gcd=k;
23 }
24 k++;
25 }
26 return gcd;
27 }
28 }

之后再做一个将十进制数转换为十六进制数的

Decimal2Hex
 1 import java.util.*;
2 public class Decimal2Hex {
3
4 public static void main(String[] args) {
5 // TODO Auto-generated method stub
6 Scanner input=new Scanner(System.in);
7
8 System.out.print("请输入一个十进制整数: ");
9 int decimal=input.nextInt();
10 System.out.print("转换为16进制数之后为: "+decimalToHex(decimal));
11
12 }
13 public static String decimalToHex(int decimal){
14 String hex="";
15 while(decimal!=0){
16 int hexValue=decimal%16;
17 hex=toHexChar(hexValue)+hex;
18 decimal=decimal/16;
19 }
20 return hex;
21 }
22 public static char toHexChar(int hexValue){
23 if(hexValue<=9&&hexValue>=0){
24 return (char)(hexValue+'0');
25 }
26 else
27 return (char)(hexValue-10+'A');
28 }
29 }

方法抽象是通过将方法的使用和它的实现分离来实现的。

方法体可以看做是一个包括该方法实现细节的黑匣子
 

当实现一个大型程序时常用的思想是自顶向下设计和自底向上的实现

不要一次性编写完整个程序



posted on 2012-02-08 16:52  菜牙先生  阅读(327)  评论(0编辑  收藏  举报