• 締切済み

モンテカルロ法

1000人同時にじゃんけんをする場合どのような プログラムにすればいいでしょうか? javaプログラムです

みんなの回答

  • betagamma
  • ベストアンサー率34% (195/558)
回答No.3

夏に、Javaでモンテカルロ法のレポート課題を書きました。 まず、MersenneTwisterを使ってください。Java用の簡単にしようできるクラスが下のページから出されています。 http://www.axlradius.com/freestuff/mtfRandom.txt を、javaに直せば、MersenneTwisterFastクラスが使えます。使い方は、 http://cs.gmu.edu/~eclab/projects/ecj/docs/classdocs/ec/util/MersenneTwisterFast.html を参考に。 MersenneTwisterは、数学的に今まで知られているどの方法よりも質がよい擬似乱数を作り出すアルゴリズムで、しかも従来の擬似乱数アルゴリズム(線形合同法)より速いです。大学のレポートなどであっても、これを使うべきです。

  • tachiwa
  • ベストアンサー率34% (25/73)
回答No.2

katase99さんの意図するものとマッチしているか解りませんが、1000人にランダム発生する素数を与えてMax得点者を優勝とするjavaコードです。しかし素数にはなっていませんでした。どこに問題があるのかな・・・、がとにかく各人に一意の点数を与えるので、問題なく作動しました。尚モンテカルロ法はわかりませんので逆に教えて下さい。 import java.util.*; import java.io.*; import java.math.*; public class JankenGame { public static void main(String args[]){ int numDigits = 10; //得点の桁数 String[] jankenPlayer = new String[1000]; BigInteger[] bigInt = new BigInteger[1000]; Janken[] janken=new Janken[1000];//Jankenクラス for(int i = 0;i <jankenPlayer.length;i++){ jankenPlayer[i]="player["+i+"]";//ジャンケンプレイヤーを作る bigInt[i] = random(numDigits); //ランダムに整数の生成する nextPrime(bigInt[i]); //素数にする(つもり) janken[i] = new Janken(bigInt[i],jankenPlayer[i]); //Jankenクラスに素数とプレイヤーを入れる } Arrays.sort(janken); //得点の昇順にソート for(int i=0;i<janken.length;i++){ System.out.println(janken[i]); } System.out.print("1千人のじゃんけんに勝ったのは"+janken[999].jankenPlayer+"さん、"); System.out.println("得点は"+janken[999].bigInt+"点です。"); //勝者の表示 } //以下素数の作成コード public static BigInteger random(int numdigits){ StringBuffer sb = new StringBuffer(""); for(int i=0;i<numdigits;i++){ sb.append(randomDigit()); } return(new BigInteger(sb.toString())); } public static StringBuffer randomDigit(){ int index=(int)Math.floor(Math.random()*10); return(digits[index]); } public static StringBuffer[] digits = {new StringBuffer("0"),new StringBuffer("1"), new StringBuffer("2"),new StringBuffer("3"), new StringBuffer("4"),new StringBuffer("5"), new StringBuffer("6"),new StringBuffer("7"), new StringBuffer("8"),new StringBuffer("9") }; public static final BigInteger ZERO = new BigInteger("0"); public static final BigInteger ONE = new BigInteger("1"); public static final BigInteger TWO = new BigInteger("2"); public static final int ERR_VAL = 100; public static BigInteger nextPrime(BigInteger start){ if(isEven(start)) start = start.add(ONE); else start = start.add(TWO); if(start.isProbablePrime(ERR_VAL)) return(start); else return(nextPrime(start)); } public static boolean isEven(BigInteger n){ return(n.mod(TWO)).equals(ZERO); } } class Janken implements Comparable{ //Jankenクラス BigInteger bigInt; String jankenPlayer; public Janken(BigInteger bigInt,String jankenPlayer){ this.bigInt = bigInt; this.jankenPlayer = jankenPlayer; } public int compareTo(Object obj){ Janken jankenObj = (Janken)obj; double jankenValue01=this.bigInt.doubleValue(); double jankenValue02=jankenObj.bigInt.doubleValue(); if(jankenValue01>jankenValue02){ return(1); }else{ return(-1); } } public String toString(){ return("ジャンケンプレイヤー:"+jankenPlayer+"得点:"+bigInt); } }

  • yama123
  • ベストアンサー率33% (1/3)
回答No.1

1000人というはプログラムですか、それとも本物の人間ですか? やりたいことを具体的してくれると答えやすいです。

参考URL:
http://www.mech.tohoku-gakuin.ac.jp/nken/java/monte_new.html

関連するQ&A