- ベストアンサー
プログラムについて
1から453までのあいだでランダムに取得された225個の数字をいったんranに格納し、同様にran2,ran3,ran4にもランダムに取得された225個の数字を格納します。そこでran~ran4までで取得された数字の中から全部に共通して格納されている数字だけをran5に格納するようなプログラムは作成できないでしょうか? ranに格納するまでのプログラムは以下のように作成しました import java.util.*; public class RandomTest { public static void main(String[] args) { for(int i=0; i<225; i++){ int ran = (int)(Math.random() * 452)+1; System.out.println(ran); } } }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こういうのは java.util.BitSet クラスを使うと楽かも。 まずは、取り得る値が1~453ですから int min=1; int max=453; 今回の場合、255回ランダム整数生成がワンセットで、それを4セット行うのですから BitSet が4つ必要になります。 int times=4; BitSet[] bs=new BitSet[times]; for (int i=0; i<times; i++) { bs[i]=new BitSet(max+1); } BitSet のコンストラクタ引数には取り得る値の最大値+1を渡すようにします(配列と同様です)これで、454個のビット判定が可能になります(453個でも構わないのですが、ソースの可読性を上げる為にそうしました。数値=インデックスの方が意味を掴みやすい) 次に、255回ランダム整数を生成し、生成した数値と同様の BitSet の桁を true に変更します(ビット立て) for (int i=0; i<255; i++) { bs[0].set((int)(Math.random()*(max-min+1))+min) ; } 同様に、bs[1],bs[2],bs[3] も処理します。 次に、4回とも選ばれた数値を求めるには、各々の bs 同士を and() すれば良いだけです。 BitSet totalbs=null; for (int i=0; i<bs.length; i++) { if (i==0) { totalbs=(BitSet)bs[i].clone(); } else { totalbs.and(bs[i]); } } これで、totalbs のビットが立っている(True)インデックスが全ての回に出現した値になります。 最期に int[] 型に変更するのですが、SDK1.4 以降でしたらもう少し楽に出来るのですが、出来るだけ多くのバージョンでも動かせるようでないと辛いので、java.util.ArrayList を使う事にします。 ArrayList arrayList=new ArrayList(); for (int i=0; i<totalbs.length(); i++) { if (totalset.get(i)) { arrayList.add(new Integer(i)); } } Object[] objectArray=arrayList.toArray(); int[] ans = new int[objectArray.length]; for (int i=0; i<objectArray.length; i++) { ans[i]=((Integer)objectArray[i]).intValue(); } 以上で ans が「4回ともに出現した値が格納されている配列」になります(もっと簡単に出来るかもしれませんが・笑)
その他の回答 (2)
- chi-kon
- ベストアンサー率43% (58/132)
やりたいことは イメージとしてはロト6の最近4回のすべてに出現して数字をもとめたいということでしょうか? 質問にあるランダムというのは どういうランダムなのでしょうか? 重複出現がありなのですか?
- azicyan
- ベストアンサー率21% (368/1747)
225個格納する、とはどのようにするおつもりですか? 配列?? ちなみに例のプログラムでは、FOR分が実行されるたびに上書きされていくのであって、225回目の乱数がひとつ格納されるだけですよ・・・? >全部に共通して格納されている数字 と言うのは、等しい数字?と言うことですか?? ran0[255] ran1[255] ran2[255] ran3[255] ran4[255] と定義しておいてからIFを使って ran[0]の数字と等しいものがran1[x]にあるか調べ あったら、今度はそれがran2[x]にあるかしらべて・・・ と繰り返していってran4[x]まであったらran5[x]に格納していく・・・ とすれば実現できると思いますが、 アルゴリズムはいろいろあるので、 これが答えではないです。