- ベストアンサー
JAVA 乱数で同じ数字を出さない方法
JAVAで乱数を使いたいのですが、同じ数を出さない方法が今一度 わかりません。 プログラムはサーブレットで記述しており、ブラウザで「数を出す」ボタンがおされたら、リクエストを受けたサーブレットは、一つ、1~10までの数を出し表示はJSPです。そしてまたボタンが押されたら、一つ、1~10までの数を出します。 以下に今のサーブレットに記述してあるプログラムの状態を書かせていただきますので、同じ数字を出さない方法が何かございましたら教えてください。宜しくお願いします。 long seed = System.currentTimeMillis(); //時間で乱数値をとる Random r1=new Random(seed); //乱数ジェネレータを作成する int i; i = r1.nextInt(10)+1;//入力された命令回数をint型に変換し1から10までの数が出されiに入る。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
もちろんIteratorによる順次アクセスも可能です。 先ほどの例に続けると、下記の様になるでしょうか。 import java.util.Random; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; // 追加部分 class Test { public static void main(String [] args) { ArrayList<Integer> list = new ArrayList<Integer>(); for(int i=0 ; i<10 ; i++) { list.add(i); } System.out.println(list); Collections.shuffle(list , new Random()); System.out.println(list); // 追加部分 Iterator<Integer> it = list.iterator(); while(it.hasNext()) { System.out.print(it.next() + " "); } System.out.println(); } }
その他の回答 (5)
>なるほど。あの変な質問ですが・・・もしなんですが、サーブレットでこのような定義をしたら、リクエストがあるたびにまたいちから数値をランダムにして取り出すので、同じ数字がでてしまいますよね。?恐らくそのようになると思うのですが・・・・。 そうですね。そうなると思います。 私はサーブレットは詳しくないので、サーブレットでどのような手法を用いるのが適切かはわかりませんが、 一般論としては乱数列をあらかじめファイルなどに用意しておき、 リクエストがあるたびにファイルから乱数を取り出し、 消費した乱数を消去する、というような手順をとることになるかと思います。
お礼
なるほど。確かにそのようにも考えられますね。 わかりました。皆様からのアドバイスをもとに、もう少し考え、まとめてみます。恐らく、サーブレットとモデル両方で試してみる必要もあるかと思いますので。モデルで考える際には、あなた様のご回答の例プログラムを参考にさせていただきたいと思っております。 この度は、ご親切なご回答誠にありがとうございます。 とても助かりました。 あなた様を含め、ここでご回答して下さった方々には大変感謝しております。 ここ数日間、様々な方にアドバイスを頂きお世話になっております。 私は幸せ者です。今後も、何卒宜しくお願い申し上げます。
rancoさんのおっしゃているやり方を使用した場合の簡単な例です。 1~9までの数字をリストに用意し、シャッフルして乱数列とします。 import java.util.Random; import java.util.ArrayList; import java.util.Collections; class Test { public static void main(String [] args) { ArrayList<Integer> list = new ArrayList<Integer>(); for(int i=0 ; i<10 ; i++) { list.add(i); } System.out.println(list); Collections.shuffle(list , new Random()); System.out.println(list); } }
補足
あ、ありがとうございます。突然素晴らしい回答をして下さったので、驚き、言葉がでませんでした。とても助かりました。 あの、もう一つお聞きしたいのですが、listの先頭からひとつ 取り出すのはiteratorでせきると思うのですが・・・・できますよね? あ、でも、iteratorを使うと次々に入っている数字が出てしまいますよね?ここのところを、もしよろしければ教えていただけませんでしょうか?
- nak777r
- ベストアンサー率36% (49/136)
サーブレット という事は WEBですよね 10人がアクセスしたら、10人に違う数値を出せと言うことですか? 11人がアクセスしたら無理なので違うのかな 同じ人(ブラウザ)が、10回、数を出すボタンを押すと言う話だとして 11回目は? 次の日とかは? ブラウザの戻るを押した場合は? 質問に、ここら辺の説明が無いと 既に出した1~10の乱数を覚えるバッファをstatic にすればいいのか セッションにすればいいのか、postでやり取りするのか 全然やり方が変わると思うのですがどうなのでしょうか
補足
ご回答、補足要求ありがとうございます。説明不足な点がおおくあり大変失礼いたしました。あなた様の補足要求を拝見し、確かにおっしゃるとおりと思いましたので、一応?の部分の補足説明をさせていただきます。もしこれで、何か方法がございましたらご回答宜しくお願い致します。 >10人がアクセスしたら、10人に違う数値を出せと言うことですか? ■はい、そうです。今は何人アクセスしようが、同じ数字を出さないようにしたいのです。 >同じ人(ブラウザ)が、10回、数を出すボタンを押すと言う話だとして >11回目は? ■そうですね、1から10と書かせていただきましたが、1から11あるいは1から100になる可能性も考え、数は増えてもアクセスしたら同じ数字を出さないようにしたいです。 >次の日とかは? ■たとえば、Aさんが8回ボタンをおしましたが、次の日9回からのカウントになるわけではありません。 数を出すときに、カウントしていて、初期値0を与えていますので、また1からとなります。 >ブラウザの戻るを押した場合は? ■戻るボタンをおしたら、またカウントの初期化なり、0からカウントされます。そしてまた、ランダムで同じ数字をださないように、の繰り返しです。 ■■私はサーブレットで、ランダムを出し、モデルに数を入れ、JSPに参照させております。MVCでこの流れをしております。なぜMVCなのかは、話が複雑になりますので、今は何でもよいですので、方法やその記述の仕方等、教えてくださる方がおりましたら、お願いしたいと思っております。以上補足説明をさせていただきました。
- _ranco_
- ベストアンサー率58% (126/214)
整数値の順序数をArrayListなどに入れて、Collections.shuffle()メソッドでシャッフルします。それをArrayListの先頭から順に使います。
お礼
専門家はやはりさまざまことご存知ですね。 そのような方法があるとは。 あの、お手数ですが、先ほどのアドバイスを付け加えるとしたら、 私のプログラムをどのように記述したらよいか、例を打っていただけませんでしょうか? これは無理な頼みですので、だめな場合はご回答はなさらなくて大丈夫です。
- DIooggooID
- ベストアンサー率27% (1730/6405)
ここで得られた "乱数" の利用目的が分かりませんが、【同じ数を出さない】といった操作を加えた時点で、それは乱数ではなくなってしまいます。 例えば、{1,2,3,4,5,6,7,8,9,10} の集合から、任意に1つの要素を取り出す、と言うようなことを考えなければならないと思います。
お礼
確かに、おっしゃるとおりかもしれません。 同じ数字を出さない時点で、乱数ではないな、と思っておりました。 あなた様がアドバイスしてくださった考え方でも試したいと思います。 今後結果がでましたら、補足のところに載せていただくかもしれません。アドバイスありがとうございました。 今後もよろしくお願いいたします。
補足
なるほど。あの変な質問ですが・・・もしなんですが、サーブレットでこのような定義をしたら、リクエストがあるたびにまたいちから数値をランダムにして取り出すので、同じ数字がでてしまいますよね。?恐らくそのようになると思うのですが・・・・。