- ベストアンサー
1と0の文字列作成
1の後には0.9の確率で1、0.1の確率で0 0の後には0.9の確率で0、0.1の確率で1 という条件で、1と0の文字列作成しようと下のプログラムを作ってみました。 しかし実行してみるとなぜか1の後には0がきてしまうことが多く、条件のようになりません。 どこがおかしいのででしょうか? public class Sample{ public static void main(String[]args){ int a[]=new int[50]; Kansuu1 b = new Kansuu1(); Kansuu2 e = new Kansuu2(); a[0] = 0; for(int i=0; i<50; i++){ if(i==0){ System.out.print(0); }else{ int c = 0; if(a[i-1]==0){ c = b.kan1(a[i]); }else { c = e.kan2(a[i]); }System.out.print(c); } } } } class Kansuu1{ int kan1(int a){ if(Math.random()>0.9){ return 1; }else { return 0; } } } class Kansuu2{ int kan2(int a){ if(Math.random()>0.9){ return 0; }else { return 1; } } }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
NO1のものです。 1つ前の状況(0or1)から次の値を算出しそれを出力します。 下記にようになるかと思うのですが。。。 a[0] = 0; for(int i=0; i<50; i++){ if(i==0){ // 何もしない }else{ if(a[i-1]==0){ a[i] = b.kan1(a[i-1]); }else { a[i] = e.kan2(a[i-1]); } } System.out.print(a[i]); }
その他の回答 (3)
- noboru2000
- ベストアンサー率33% (47/140)
何か回りくどい書き方してますね。(もしや配列を使ったり他のクラスを作らねばならないという宿題ですか?) 乱数を求めるのをわざわざ他のクラスにする必要はないです。あと、出力するだけでいいのなら一つ前の値を保持しておけばいいだけで、配列に全部保存しておく必要はありません(あとで使う必要があるんだったとしても、結果を保存すればいいだけです)。確率についても 0.1 の確率で変化するというだけなので、0.1 の方だけ考えれば済みます。 ということで、そのプログラムはこんな感じに簡略化できます。 int a = 0; for (int i = 0; i < 49; i++) { System.out.print(a); if (Math.random() < 0.1) a = a == 0 ? 1 : 0; } System.out.println(a); p.s. 0 と 1 を反転させる所は a ^= 1; でもできます。
- ssm3u
- ベストアンサー率52% (19/36)
たびたびですが、 kan1,kan2に引数を渡す意味が全くありませんね。 if(a[i-1]==0){ a[i] = b.kan1(); }else { a[i] = e.kan2(); } これで十分のようです。
お礼
ssm3u様 返事遅くなってしまい申し訳ありません。 そして、多数の回答をして頂きありがとうございました。 No.2の通りに改良したところ、希望する結果が得られました。 この度はありがとうございました。 この返事で、合わせてお礼させて頂きます事ご了承下さい。
- ssm3u
- ベストアンサー率52% (19/36)
ぱっと見た限り・・・ 戻り値を cにいれていますが、それをa[i]に反映していません。 1の後に、とか、0の後には全く無視して、 ただ乱数で 0か1を出しているだけのようです。
お礼
初心者のため、今考え得るプログラムを作ったところこの様になってしまった次第です。 簡略化に向けて参考になりました。 ありがとうございます。