提出したので
Java版と素直にCで書いた高速版を公開。
package montecalro; import java.io.*; public class Main { public static void main(String[] args){ new Montecalro().start(); } } class Montecalro{ static final int RADIUS = 29 * 10; static final int DIAMETER = RADIUS * 2; int circle; int dots; double x,y; double distance; void start(){ while(true){ init(); if(dots<=0){ System.out.println("====終了===="); return; } calc(); } } void init(){ circle = 0; boolean loop = true; System.out.println("点の数を入力してください(非正整数の入力で終了)"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(loop){ loop = false; try { dots = Integer.parseInt(br.readLine()); } catch (NumberFormatException e) { System.out.println("数値を入力してください"); loop = true; } catch (IOException e) { System.out.println("エラーが発生しました"); e.printStackTrace(); System.exit(1); } } } void calc(){ for(int i=0;i<dots;i++){ x = Math.random() * RADIUS; y = Math.random() * RADIUS; if(distance()<RADIUS){ circle++; } } System.out.println("理論値 : " + RADIUS * RADIUS *Math.PI); System.out.println("結果 : " + (double)(DIAMETER * DIAMETER) * ((double)circle / (double)dots)); } double distance(){ return Math.sqrt(x*x + y*y); } }
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #define RADIUS 290 #define DIAMETER (RADIUS*2) int main(void){ int i; int circle; int dots; char temp[20]; double x,y; srand((unsigned)time(NULL)); while(1){ circle = 0; puts("点の数を入力"); scanf("%s",temp); dots = atoi(temp); if(dots<=0)break; for(i=0;i<dots;i++){ x = (double)rand()/RAND_MAX * RADIUS; y = (double)rand()/RAND_MAX * RADIUS; if(x*x+y*y<RADIUS*RADIUS)circle++; } printf("理論値=%f\n",RADIUS*RADIUS*M_PI); printf("結果 =%f\n",DIAMETER*DIAMETER*((double)circle/dots)); } puts("====終了===="); return EXIT_SUCCESS; }