• 締切済み

モンテカルロ法

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

  • モンテカルロ法について

    SPh法を使って、シミュレーションをしようと思ってます。プログラムで粒子を球状に分布させようとしているのですがうまくいきません。どのように書けばいいか教えてください。Fortranを使っています。

  • モンテカルロ法

    モンテカルロ法で円(半径y=1、x=2の楕円)の面積を求める計算なのですが、 http://www.geocities.co.jp/SiliconValley-SanJose/8366/kihonC.html このURLのプログラムについて、 ソースプログラムの15行目をxの半径が2なので、”2*”となっているのは分かるのですが、 ・17行目でx*xを4で割ることの意味 (2x*2xとなるから4で割ってるのかなとか漠然とは思うのですが、理解をつめたいです。。) ・20行目でinを2倍している意味 を教えていただきたいです。 よろしくお願いいたします。

  • ルーレットのモンテカルロ法

    ルーレットの攻略法にモンテカルロ法(赤、黒などの2倍のエリアの場合1,2,3で最初1+3で4を賭け、当たった場合は両脇から1つずつ数字を消していく。負けた場合は4を足して1+4で5を賭けていく。3倍のエリアの場合は当たったとき両脇から2つずつ数字を消していく。)と言う賭け方がありますが、これらはいずれも1箇所に賭ける場合の計算方法です。 3倍のエリアで2箇所に同時に賭ける場合の計算方法がわかりません。 どなたか解りやすく教えて下さい。 お願いします。

  • モンテカルロ法

    モンテカルロ法で円周率の推定値を計算することを最近習ったのですが、定積分でもそれが可能なのを知り、どうやってプログラムを組めばいいのか分からず、困っています。 例えば、定積分∫[0→1]x^2dx=1/3~0.333([0→1]というのは、積分範囲です。)をモンテカルロ法で計算すると、どういうプログラムを組めばいいのでしょうか? わかる範囲で書いてみたのですが…積分の範囲をどうやってプログラミングすればいいのか、いまいち分かりませんでした。 教えていただけると、助かります。よろしくお願いします。 RANDOMIZE INPUT n SET WINDOW -0.1, 1.1, -0.1,1.1 DRAW grid SET POINT STYLE 1 LET sumin=0 FOR i=0 TO n LET x=RND LET r=x*x SET POINT COLOR 2 ! PRINT USING "(%.####, %.####)": x,y; PLOT POINTS: x,y; NEXT i PRINT sumin;n PRINT sumin/n END

  • BASICでモンテカルロ法

    モンテカルロ法で円周率の推定値を計算することを最近習ったのですが、定積分でもそれが可能なのを知り、どうやってプログラムを組めばいいのか分からず、困っています。 例えば、定積分∫[0→1]x^2dx=1/3~0.333([0→1]というのは、積分範囲です。)をモンテカルロ法で計算すると、どういうプログラムを組めばいいのでしょうか? わかる範囲で書いてみたのですが…積分の範囲をどうやってプログラミングすればいいのか、いまいち分かりませんでした。 教えていただけると、助かります。よろしくお願いします。 RANDOMIZE INPUT n SET WINDOW -0.1,1.1, -0.1,1.1 DRAW GRID SET POINT STYLE 1 LET sumin=0 FOR i=0 TO n LET x=RND LET y=RND SET POINT STYLE 2 IF y<x*x THEN SET POINT COLOR 4 LET sumin=sumin+1 END IF ! PRINT USING "(%.####, %.####)": x,y PLOT POINTS: x,y NEXT i PRINT 1*1*sumin/n END

  • fortran モンテカルロ法

    モンテカルロ法により円周率πを計算するプログラムを作ったのですが、以下のプログラムでモンテカルロ法から推定された円周率piの値が実行すると大きな数字になってしまって、うまく計算できてない見たです。式に問題があるのでしょうか?教えて下さい。 rogram list1_9 implicit none real(8) x, y, pi, pi0 integer :: n, i, im = 2**20 pi0 = 2.0d0*acos(0.0d0) n = 0 do i = i, im call random_number(x) call random_number(y) if(x ** 2 + y ** 2 <= 1.0d0) n = n + 1 enddo pi = 4.0d0*dble(n)/dble(im) write(*,*) ' pi, pi0, er = ', pi, pi0, pi-pi0 end program list1_9

  • モンテカルロ法

    モンテカルロ法を使って計算を行う際に、 ある方法を用いて乱数列を発生させ、それを用いて行いました。 この乱数列は50の区分に分けた後、 カイ2乗分布による危険率1%の頻度検定 に合格したものを用いたのですが、 これではモンテカルロ法による計算を行うには 正しいとはいえないとのことでした。 これはなぜなのでしょうか。 確かに、50区分の頻度検定だけでは、 極端な話、周期50の数列がちょうど50区分に分かれて発生していて 結果として一様乱数となっているような場合も考えられます。 それでは、周期が計算に必要な乱数の数に対して十分に大きいとき、 モンテカルロ法として正しいと言えるようになるのでしょうか? 解説をよろしくお願いします。

  • 複数のJavaプログラムでデータを共有する方法について

    レベルの低い質問だとは思うのですが、相談にのってください。 Javaでコンソールプログラムを作っています。 コマンドプロンプトを複数立ち上げ、同じJAVAプログラムを同時に実行します。(プログラムは同じですが、処理内容はそれぞれ異なります。並列な処理です。) これら複数のプログラム同士でデータ(処理の進捗状況など)を共有するにはどうすればいいでしょうか。(そもそもそんなことができるのでしょうか) 今考えているのは、共有データ用のテキストファイルを1つ作り、それを各プログラムが参照(読んだり書き込んだり)する、ということ考えています。しかし、これだと複数のプログラム同士が同時にファイルを読み書きするようなタイミングがあるかもしれず、思ったような動作をしないかもしれません。 そこで、質問です。 (1)今回のような場合(コマンドプロンプトを複数立ち上げ、同じJAVAプログラムを同時に実行)で、データ共有に使えそうなトピックや方法があれば、お教えください。ヒントでもなんでもいいです。(とりあえず、ちょっとした付け焼刃でなんとか動いてほしいので……) (2)「コマンドプロンプトを複数立ち上げ、同じJAVAプログラムを同時に実行」しているのは、単に私の技術が低いからです。今後プログラムを根本的に書き直して改良するために、今後どのようなJavaのトピックを勉強すればいいでしょうか。 乱文失礼いたしました。どうかよろしくお願いします。

  • 数値積分 モンテカルロ法を用いて

    次の問題をモンテカルロ法を用いたC言語のプログラムを教えてください。 積分区間[0,10] ∫x^3+x^2-2x+10dx です お願いします。

  • モンテカルロ法 計算精度

    モンテカルロ法で円周率をc++言語でプログラムを作成して求めたのですが、精度要因って何ですか??乱数の乱数らしさでしょうか??