• ベストアンサー

ランダムでのboolean値の与え方

boolean[] box = new boolean[100] と設定した配列にランダムでtrue か false を与えたいのですが方法がよくわかりません。そのときtrueの数は配列の全体数の2分の1以下(上の配列だと50以下)になるようにしたいのですが、どうすればよいですか?

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

  • ベストアンサー
  • m_mik
  • ベストアンサー率26% (31/117)
回答No.4

自分でtrueの数を決めてランダムにするばあには、毎回ランダムの結果からtrue/falseを決めるよりも、以下の方法が有効だと思います。 (例)全体で30個trueを設定する。 int i; // boolean[0]~[29]をtrueで初期化 for (i = 0 ; i < 30 ; i++) { boolean[i] = true; } // boolean[30]~[99]をfalseで初期化 for ( ; i < MAX ; i++) { boolean[i] = false; } // 100回入れ替えを行う for (int count = 0 ; count < 100 ; count++) { // 0~99のランダム値を2つ取得 int x = (int)(Math.random() * 99); int y = (int)(Math.random() * 99); // 上記で選択された値を配列の要素番号として // 入れ替え int work = boolean[x]; boolean[x] = boolean[y]; boolean[y] = work; } こうすると、自分で設定したtrueの数分の配列が作成されます。 ただし、いつでも規定回数(上記の場合は100回)の入れ替え処理が行われますので、ご自分で最適な回数を見つけるようにしてください。

kuropanda
質問者

お礼

この方法でくんでみました。ありがとうございます。

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

その他の回答 (5)

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

//#3を実現したもの。ちょっと違ってますか・・ import java.util.*; public class Sample { public static void main(String[] args) { Boolean [] box = new Boolean[100]; Random rnd = new Random(); int range = rnd.nextInt(50); int i=0; Vector<Boolean> vb = new Vector<Boolean>(); for(i=0;i<box.length;i++) vb.add(i<range); Collections.shuffle(vb); box = vb.toArray(box); //点検出力 int c=0; for(i=0;i<box.length;i++){ System.out.printf("box[%d]=%s%n",i,box[i]); if(box[i])c++; } System.out.printf("true:%d個%n",c); } }

全文を見る
すると、全ての回答が全文表示されます。
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.5

どのような「ランダム」さをお求めでしょうか? 一般に、全くランダムに 100 個の true/false 値を選び出した場合、true と false が 50 個づつになる確率の方が true が 100 個で false が 0 個になる確率より遥かに高いです。 しかし、あらかじめ true の数を 0 個以上 50 個以下の範囲で決めるというやり方では、上の二つの確率は等しくなります。 質問者さんがどのような「ランダム」さを求めているかによって、答えとなる方法も変わってくるのですが、どうでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

まず、 Math.random( )か、 Randomクラスを利用して、trueの数を決めます。 50以下にならなかった場合は、決めなおします。 その数だけ、配列の先頭からtrueを設定します。 Collections.shuffle( )を使って配列をシャッフルします。

全文を見る
すると、全ての回答が全文表示されます。
noname#18558
noname#18558
回答No.2

java.util.Randoまたは、java.lang.Math#random を参考にして下さい。

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/Math.html#random()
全文を見る
すると、全ての回答が全文表示されます。
noname#17596
noname#17596
回答No.1

ごく簡単に考えると乱数を使用して奇数/偶数でtrue/falseにするというのはどうでしょう。この場合「必ず」trueの数が全体の1/2以下になるという保証はないですが。 「必ず」trueの数を全体の1/2以下にしなければならないのであれば、true/falseを決めながらtrueの数が1/2に達したら残りはすべてfalseにするとか、全体を決めてから後で数を調整するなどが思い浮かびますがいかがでしょうか。

kuropanda
質問者

お礼

そういう考え方もあるんですね。ありがとうございます。

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

関連するQ&A

  • boolean型を参照渡ししたい

    boolean型を引数で参照渡しにするにはどうすればいいのでしょうか。 そんな変な実装はしてはいけない等はわかっています。 参照渡しは可能か、もし可能ならば記述方法を教えて下さい。 よろしくお願いします。 下の例の(1)ようにラッパークラスを使ってみましたが、 (2)の部分では値はfalseのままでした。 public main(){     Entity entity;     Boolean flg = false;     sub(Entity entity, Boolean.valueOf(saveFlg)); …(1)     (2) } public void sub(Entity entity, Boolean flg){     flg = true;     return; }

    • ベストアンサー
    • Java
  • 変数booleanの扱い方

    下記のコードでコンパイルしたところ、出現 int 互換性のない型 要求:boolean boolean bl = 0 ; とエラーが出ました。コード上でまず、bl = 0 と0が入るのがまず分からないのと、trueとfalseを入れ換えているのがわかりません。すみませんが、かなりわかってないので、出来るだけ詳しく説明お願いします。 boolean bl = 0; for(int i=0; i<5; i++) for(int j=0; j<5; j++) if(bl == false){ System.out.print('*'); bl = true; } else{ System.out.print('-'); bl = false; } } お決まりのクラス宣言などのコードは省きました。

    • ベストアンサー
    • Java
  • booleanの戻り値について

    配列の等価判定をしたいのですが思うように動かないです。 助けてください import java.io.*; class Kadai4 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int[] TBL1; int[] TBL2; TBL1 = new int[5]; TBL2 = new int[5]; boolean flg=true; System.out.println("配列1を入力"); for (int i = 0; i <= 4; i++) { String s1 = br.readLine(); int t1 = Integer.parseInt(s1); TBL1[i] = t1; } System.out.println("配列2を入力"); for (int i = 0; i <= 4; i++) { String s1 = br.readLine(); int t1 = Integer.parseInt(s1); TBL2[i] = t1; } // 配列表示 System.out.println("配列表示"); for (int i = 0; i < TBL1.length; i++) { System.out.print(" TBL1[" + i + "]=" + TBL1[i]); } System.out.println(""); for (int i = 0; i < TBL2.length; i++) { System.out.print(" TBL2[" + i + "]=" + TBL2[i]); } toka(TBL1, TBL2); System.out.println(""); if (flg == true) { System.out.println("配列は等価"); } else { System.out.println("配列は非等価"); } } private static boolean toka(int[] ss1, int[] ss2) { boolean flg = true; for (int i = 0; i < ss1.length; i++) { if (ss1[i] != ss2[i] || ss1.length != ss2.length) { flg=false } } return flg; } }

  • boolean型の戻り値は可能か

     今日は、Cの初心者です。  比較した値をboolean型でとりたいのですが、色々と調べたのですが、Cではboolean型は定義されてないのでしょうか。  if(a>b); printf("true\n");というような書き方しか出来ないのでしょうか。  例えば   if(a>b);   printf("%●\n"、(a>b));  という書き方で直接"true"とか"false"を取らすとか、  "0"、"1"、"-1"の戻り値をとらせることは出来ないのでしょうか。

  • Boolean型変数の値を反転する方法

    ご存知の方教えて頂けますか? Boolean型変数の値が True なら False,False なら True に変換したいのですが、現在次のようにcodeを書き、希望した値になります。 Dim bool As Boolean 中略 bool = bool - True このcodeは正しいのでしょうか? 他に ”正しい方法”があるのでしょうか? スミマセン!よろしくお願いします。

  • booleanの意味・・・

    お世話になります。 javaの勉強をし始めたばかりなのですが booleanの理解がなかなか出来なくて困っています。 例えば、 public ArrayList search(ArrayList blist, String word) { boolean hit = false; ArrayList setList = new ArrayList(); for (int i=0; i<blist.size(); i++) { Parson bean = (Parson) blist.get(i); int n =bean.getName().indexOf(word); if (n != -1) { setList.add(bean); hit = true; } } if (! hit) { System.out.println("その文字では検索できません!"); } return setList; } というプログラムで、booleanを使っていてif (n != -1)のブロックに 入った時は、hit=tureで下のif (! hit)の処理を行うのは分かるのですが…。 もし、if (n != -1)のブロック内に入らなければhitはfalseのままでは ないのでしょうか? falseのまま、if (! hit)のブロックにきたらhitはtrueになるので 処理は行われないのでは?と思うのですが…。 この辺の理解ができなくて、教えて頂きたく思います。 宜しくお願いします。

    • ベストアンサー
    • Java
  • boolean を返すクラス(Java)

    JAVAについての質問です。 Java versionは1.6.0_43で、 BlueJ versionは3.0.8です。 これはDriveです↓ Temperature t1 = new Temperature (); Temperature t2 = new Temperature ('F'); t2.setTempObj(32.0); System.out.println ("Does 0C equal 32F: " + t1.equals(t2)); そしてこれがクラス↓ public boolean equals(Temperature testObj) { return //ここにいれるものがなにかわからない。 } アウトプットはtrueです。 booleanのところがdoubleとかなら入れものがわかるのですが、 trueかfalseの場合分けみたいなときはなにを入れたらいいのでしょうか? if文をいれようとも考えましたが結局意味がわからず終いでした。 必要な情報があったら言ってください。 乱文ですが、よろしくおねがいします。

    • ベストアンサー
    • Java
  • booleanについて

    お世話になります。 javaを始めて10日程の初心者です。 boleanの使い方がよく分かりません。 例: public class a { public static void main(String[] args){ // "あなたは20歳以上ですか?(Yesならtrue、Noならfalse)"; boolean isAdult = true; if (isAdult) { System.out.print(" 成人です "); } else { System.out.print(" 子供です "); } } } これを実行すると、”成人です”が出力されます。 例えばbooleanを使用せずに int age; if(age>=20) { System.out.print(" 成人です "); } else { System.out.print(" 子供です "); } とすれば解決できるのですが、 booleanを使用しようとすると理解できなくなります。 宜しくお願いします。

  • ループの終わらせ方

    あるboolean配列でtrueなら■falseなら□を表示させ、時間とともにある規則で動かしていくプログラムを組みました。配列の宣言などを省略してますがこんな感じです。 do{ boolean[] box2 = (boolean[]) box.clone(); for ( i = 0; i < box2.length; i++) { if (box2[i]) { // コピーの玉があったら // 右方向に向かって空き箱を探す。 for (int j = 1; j < box.length; j++) { int p = (i + j) % box.length; if (! box[p]) { // 空き箱を見つけたので玉を入れる(trueにする)  box[p] = true; // 元の場所は玉を消す(falseにする) box[i] = false; // box2[i]はもう二度と調べないのでそのまま放置 break;   } }   } } box2 = null; for(h=0; h < box.length; h++){   if(box[h] == false) System.out.print("□"); if(box[h] == true) System.out.print("■"); } r++; }while(box == box && r<20); ちなみに表示結果は □■■□□■□□■□□■ ■□□■■□■□□■□□ □■□□□■□■■□■□ ・ ・ こんな感じになります。ここで質問なんですが、 過去と同じ配置の配列が出てきた時点でwhile文の ループを終わらせるにはどうすればよいでしょうか? 現時点ではループが20回になった時点で止めるようにしてます。

  • 配列変数に重複のないランダムな数字を入れて行くには?

    JavaScript初心者です。 配列にランダムな数字を入れたいのですが、 aRnd = new Array(); aRnd[0] = Math.floor(Math.random()*100); aRnd[1] = Math.floor(Math.random()*100); aRnd[2] = Math.floor(Math.random()*100); のようにやると各配列にはランダムな数字が入りますが、重複が発生する可能性があります。これを重複が発生しないようにしたいのですが、どのようにすればいいのでしょうか? なお、上記例では0~99までの数字を3つの配列にセットする方法となっていますが、配列数や数字の最大値は変更する可能性があるので、これも配慮したいと思います。 よろしくお願いいたします。

このQ&Aのポイント
  • 付き合っている彼氏はお堅い仕事をしていて、私は栄養士をしているのですが、環境が悪いために転職を考えています。彼氏は公務員の栄養士を提案しましたが、彼氏の見栄や私自身の意志を考えると複雑な気持ちです。
  • 私は仕事をする上で職場環境や人間関係を気にするタイプなので、彼氏から特定の場所で働いて欲しいと言われるのは少し嫌です。自分自身で仕事を選ぶ自由を持ちたいと思っています。
  • 彼氏の提案は福利厚生や待遇面で良い点がありますが、何よりも自分自身の幸せや充実感を優先したいと思っています。周りの反応や見栄に惑わされず、自分の選択に自信を持ちたいです。
回答を見る