• ベストアンサー

マルコフ性による文字列生成

0と1の文字列をマルコフ性を用いて生成したいです。 例えとして、 ・初期値:0 ・0の時、次に0の確率:0.7  0の時、次に1の確率:0.3 ・1の時、次に1の確率:0.7  1の時、次に0の確率:0.3 と与えた時、10桁の文字列を生成するプログラム。 といったものです。 forやwhileの反復構造を使ってプログラムを作れば出来る気がするのですが、確率を計算式でどのように扱えば良いのか分からず詰まっております。 よろしければ、どなたか教えて下さいませm(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
  • fortranxp
  • ベストアンサー率26% (181/684)
回答No.1

では一例を示します。 よく題意が理解できていないかもしれませんがヒントになれば。 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; } }

wa_luigi
質問者

お礼

初心者の私にも大変分かり易いプログラムでした。 迅速なる対応ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>確率を計算式でどのように扱えば良いのか 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; } }

wa_luigi
質問者

お礼

なるほど。こういった方法もあるのですね。 今の私には、少し高度なプログラムですので勉強させて頂きます。 迅速なる対応ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字列生成を総当りで行う場合

    初めての質問で分かりにくいところもあるかと思いますが宜しくお願いします。 あ,い/うえ/おか,き,くけこ/さ/しす という文字列から、 あ/うえ/おか/さ/しす あ/うえ/き/さ/しす あ/うえ/くけこ/さ/しす い/うえ/おか/さ/しす い/うえ/き/さ/しす い/うえ/くけこ/さ/しす このような文章を作りたいのです。 言葉で説明しにくいのですが、"/"と"/"の間にある文字列を必ず1つ使い、","があるところを総当りで文字列を生成します。 私の作ったプログラムでは、この例のように6文で済む場合なら対応できるのですが、実際に使う文章はもっと長く、"/"の区切りも多く、更に"."が10個以上あることも多いので、文が億単位で生成されることも多々あります。intで表せない(今のプログラムでは、あらかじめ何個の文ができるか計算してから文を生成しています。)場合や、文字列を格納する場所が多くなりすぎてメモリが足りなくなり、生成できません。 この文字列生成は、上記の6個ように総当りで文字列が生成できれば、どの文が最初に生成されても構いません。できれば1文出来るごとにそれを使った違う処理に移り、返ってきたらその文を捨ててまた新たな文を生成できると嬉しいです。 どうぞ宜しくお願いします。

    • ベストアンサー
    • Java
  • 空白文字列の生成

    今、javascriptの勉強をしているのですがインターネットで調べてみても、分からないところがあるので教えてください。 問題のプログラム仕様は 空白文字列(スペース)を生成する関数を作る。 関数を利用して、イメージファイルの先頭にスペースを表示していく。 コードの入力手順は 1、空白文字列を作成するspc(n)関数を作る for(i=1; i<n; i++) s=s+" "; return s; 2、イメージファイルを表示する。 3、for文を使用して「i」が1,3,5,7,9になるように繰り返しを行う。 4、関数spc(i)でi個分の空白文字列と生成し、「スペースi」とイメージファイルの間に表示させる。 という問題なのですが2番と3番はできるのですが1番と4番が分からないので教えてください。お願いします

  • ユニークな文字列を順次, 生成する関数

    C++において, 適当な文字列を元に, ユニークな文字列を順次, 生成する関数を作りたいと思っています. (LISPで云う, 関数gensym()と似た役割を持つ関数です.) 例えば, "hoge"というstringを元に, "hoge0", "hoge1", "hoge4", "hoge8", "hoge100", ...., といったように, stringが互いに重複しないように, 適当な数字を連結した文字列を順次生成したいのです. 以下のように, 私なりの方法を考えてみたのですが, これだと, 今まで生成したstringを保存するhoge_setが必要になります. 何かより良い(シンプル, 効率的な)方法がありましたら, 教えていただけますでしょうか? よろしくお願い致します. (乱数を用いた方法) 1. 元となるstring型の変数nameを, "hoge" で初期化. 既に作成したstring文字列を保存する, set < string > hoge_setを宣言. 2. 乱数を生成し, それをnameにappendしたものを, string型の変数name2に代入. 3. 同じ文字列が存在したら, 2. に戻る. 同じ文字列が存在しなかったら, hoge_setに追加する.

  • アルファベットを含むランダムな文字列を生成するには?

    通常の数字を用いた乱数を発生させるには OrderNo + Int(17 * Second(Time) * Rnd) :OrderNoはDB上にある注文番号の最終レコード値です という感じで、とりあえず適当にランダムな値を自動で生成させることができるのですが、 アルファベットなどの文字を含む場合のランダムな文字列の生成はどのようにすればよいのでしょうか? 感じできには、 UkB1PgMJ zK22fw2W N1np8zDb DbetjqKq Cj58pfYm というものです。 例は、小文字の[i][l][o]と大文字の[I][L][O]と数字の[0]を含まないランダムな文字列を8桁で生成しています。 (使用したソフトは、Fapsis氏のPassword Creator TypeB Ver3.5です) 具体的には何か関数で、このような文字列をランダムに発生させるものがあるのでしょうか?

  • 順列文字の生成処理

    次のような左端の番号に対応した右側の文字列を作りたいのです。 これらの4個の文字列は、重複無しの順列になります。 下表では文字列が4個ですが、実際には7個程度まで生成したいのです。7個の場合は合計1*2*3*4*5*6*7=5040個になります。 言語はFORTRANですがCでも、あるいは手順説明でも良いです。文字列でなくともn桁数字あるいは配列でも良いです。c++のクラス処理も候補かも知れませんが、FORTRANで書くには荷が重いです。再帰処理は何とかなるかも知れませんが、できれば無しを希望します。 4個程度ならデータとして書けば済みますが、6,7個となるとそうは行きませんので、プログラムで生成したいのです。処理時間は問題になりません。 N個の処理を使ってn+1個の処理の形式で大分頭を悩ませましたが、ギブアップ気味です(まだ1日程度ですが)。虫の良いお願いですが奇特な諸兄のお知恵を拝借したく存じます。 1: 1234 2: 2134 3: 1324 4: 3124 5: 2314 6: 3214 7: 1243 8: 2143 9: 1423 10: 4123 11: 2413 12: 4213 13: 1342 . . 18: 4312 19: 2341 . . 24: 4321

  • 文字列の操作

    こんにちは。 以下のような、文字列があるとします。 NUMBER1(ヌル\0)からNUMBER1000(ヌル\0)までの文字列があるとします。 NUMBERは付属で、ほしい文字列が1から1000までNUMBERの次にある場合、1から1000までを取得する方法として、 Buf[100] int x=0; while(Buf[x]!='\0') //ナル文字までの長さを取得 x++; memmove(&Buf[0],Buf[x-1],4); //NUMBER1の場合、長さは7。しかしほしい文字列は第6要素なのでx-1。 しかし・・・これを行うと、 NUMBER10:長さ8 NUMBER100:長さ9 ・ ・ となり、二桁以上の場合は、memmove(&Buf[0],Buf[x-2],4)と、 第2引数を手動で可変しなければなりません。 そこで、NUMBER\01\0 NUMBER\01000\0というように、 NUMBERの次にヌル文字(あってますでしょうか?)\0を挿入し、次の要素に1から1000まで文字列を挿入。そして文字列終端が分かるように再度\0を挿入します。 しかしこのような場合、ヌルを2つ挿入することで、上記に示したプログラムでは、手前の\0までしか長さを取得しないので、うまくいきません。 そこで、文字列の区切りを示すための方法として、なにかありますでしょうか? 文字列は最後に、\0を挿入することで判別すると書いてありますが、 NUMBERVISUALC++\0というような文字列を配列に格納してある場合、 NUMBERとVISUALC++をどのように分けて取得するのでしょうか? それとも、第6要素から取得した文字列があると言う事が分かっている場合、第6要素からを指定するプログラムを作るということになるのでしょうか? よろしくお願いします。

  • 文字列の修正

    初心者です よろしくお願いします Excel2010で次のようなことがしたいです 列のセルには次のような文字列が入っています  文字列 No.3 とか No.26 とか No.302 とかです  要するに「No.」の後に数字のところが 1桁 または 2桁 または 3桁です やりたいことは No.3はNo.003に No.26はNo.026にと 桁数を3桁に揃わせたいのです 関数にそのようにするものがあるのでしょうか? またあれば 同時に使い方も教えて頂きたいです よろしくお願いします。

  • ランダム文字列の生成の仕方

    こんばんは。 はじめまして。 JAVAでランダムの文字列を生成する時に何か便利な機能はあるのでしょうか? CGIでは確かあったはずなんですが、 自分なりに探してみたのですがわかりませんでした。 今の自分の考えでは、ランダムで数字は生成できるので それをChar型を使って文字コードで一文字取得して、それを連結するのかな? なんて考えています。 もっといい方法があればできればご教授ください。 よろしくお願いします。

  • 文字列中からある文字列とある文字列の間にある文字列を取得

    表題にあるとおり間の文字列をどうやって取得するべきかと悩んでいます・・ abcdefghijklmn・・・ となっているとき bとe、aとkなど間の間隔が不定なときはどのようにして文字列を取得したらよいのでしょうか? 最初の2文字は与えられているとして考えています。 インターネットのURLで言うなら/から/までの間の文字列と言うことになります。 今私が考えているのは strchrで位置のアドレスを取得してそこからfor文かwhile文で指定の2文字目が出るまでまわすのかなぁ・・と思っています。 ですが具体的にどのような感じに書けばいいのかがわかりません。どなたかご教授ください。

  • 文字列について

    textファイルをいくつかに分割して保存しようと思い、以下のプログラムを作りましたが、うまくいきません。 予定では "0000.txt", "0001.txt", ....と文字列を生成するはずです。 #include <stdio.h> #include <string.h> #define LENGTH 4 //番号の桁数 void filename(int n) {    char name[LENGTH +4 +1];    char text[5] = ".txt";    int i;    for(i = 0; i <= LENGTH; i++)       name[i] = '0';    i = LENGTH;    //自然数を文字列に変換    do{       name[i] = (char)(n%10 + 48);       i--;       n /= 10;    }while(n != 0 && i >= 0);    strcat(name, text);    printf("filename:%s", name); } int main(void) {    int i;    for(i = 0; i < 5; i++){       filename(i);       printf("\n");    }    return 0; } 実行結果は filename:00000@.txt filename:00001.txt filename:00002.txt filename:00003.txt filename:00004.txt このように、文字化けしています。 何が原因なのでしょうか。 よろしくお願いします。

このQ&Aのポイント
  • EP-710Aでスキャンを行う際に問題が発生しています。プレビューは正常に表示されるのですが、実際のスキャンが直ぐに停止し、画像を取得することができません。
  • EP-710Aのスキャナーでスキャンを行う際に問題が発生しています。スキャンを開始すると直ぐに停止し、画像が取得できません。これまで正常に動作していたのですが、突然この問題が発生しました。
  • EP-710Aのスキャナーがスキャンできない問題が発生しています。プレビューは正常に表示されるのに対し、スキャンを実行すると直ぐに停止し、画像を取得することができません。どうすれば問題を解決できるでしょうか?
回答を見る