- ベストアンサー
マルコフ性による文字列生成
0と1の文字列をマルコフ性を用いて生成したいです。 例えとして、 ・初期値:0 ・0の時、次に0の確率:0.7 0の時、次に1の確率:0.3 ・1の時、次に1の確率:0.7 1の時、次に0の確率:0.3 と与えた時、10桁の文字列を生成するプログラム。 といったものです。 forやwhileの反復構造を使ってプログラムを作れば出来る気がするのですが、確率を計算式でどのように扱えば良いのか分からず詰まっております。 よろしければ、どなたか教えて下さいませm(_ _)m
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
では一例を示します。 よく題意が理解できていないかもしれませんがヒントになれば。 class MRandom { public static void main(String[] args) { int i[]={0,0,0,1,1,1,1,1,1,1}; int j[]={0,0,0,0,0,0,0,1,1,1}; int k=0; String str=""; FRandom fr=new FRandom(); k=fr.kansu(); str=Integer.toString(i[k]); System.out.println(str); for(int l=1;l<10;l++) { if(str.substring(l,l).equals("0")){ str=str+Integer.toString(j[fr.kansu()]); }else{ str=str+Integer.toString(i[fr.kansu()]); } System.out.println(str); } System.out.println(str); } } class FRandom { private int r=0; int kansu() { r=(int)Math.floor(Math.random() *10); return r; } }
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>確率を計算式でどのように扱えば良いのか Math.random() は、0~1の範囲の数をランダムに返すので、 この結果が0.7以下であるかどうかで処理すればいいです。 以下は1つのサンプル (状態を持たせてジェネレーターみたくした方が良かったかも・) ---------------------------------------------------------------- public class Sample { public static void main(String[]args){ MarkovStr ms = new MarkovStr(); // MarkovStr("0", 0.7, 0.7); String mstr = ms.getString(10); System.out.println(mstr); } } class MarkovStr { private String str = "0"; private double nextZeroProbability = 0.7; private double nextOneProbability = 0.7; public MarkovStr(){} public MarkovStr(String initStr, double zeroP, double oneP){ str = initStr; nextZeroProbability = zeroP; nextOneProbability = oneP; } public String getString(int size){ String wk=str; while(size>wk.length()){ wk=makeNextChar(wk); } return wk; } private String makeNextChar(String str){ char lastChar = str.charAt(str.length()-1); char nextChar ; double Probability = Math.random(); if(lastChar == '0'){ nextChar = (nextZeroProbability >= Probability)? '0' : '1'; } else { nextChar = (nextOneProbability >= Probability)? '1' : '0'; } return str + nextChar; } }
お礼
なるほど。こういった方法もあるのですね。 今の私には、少し高度なプログラムですので勉強させて頂きます。 迅速なる対応ありがとうございました。
お礼
初心者の私にも大変分かり易いプログラムでした。 迅速なる対応ありがとうございました。