
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に入る。

No.5ベストアンサー
- 回答日時:
もちろん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();
}
}
この回答への補足
なるほど。あの変な質問ですが・・・もしなんですが、サーブレットでこのような定義をしたら、リクエストがあるたびにまたいちから数値をランダムにして取り出すので、同じ数字がでてしまいますよね。?恐らくそのようになると思うのですが・・・・。
補足日時:2007/12/26 10:33
No.6
- 回答日時:
>なるほど。
あの変な質問ですが・・・もしなんですが、サーブレットでこのような定義をしたら、リクエストがあるたびにまたいちから数値をランダムにして取り出すので、同じ数字がでてしまいますよね。?恐らくそのようになると思うのですが・・・・。そうですね。そうなると思います。
私はサーブレットは詳しくないので、サーブレットでどのような手法を用いるのが適切かはわかりませんが、
一般論としては乱数列をあらかじめファイルなどに用意しておき、
リクエストがあるたびにファイルから乱数を取り出し、
消費した乱数を消去する、というような手順をとることになるかと思います。
なるほど。確かにそのようにも考えられますね。
わかりました。皆様からのアドバイスをもとに、もう少し考え、まとめてみます。恐らく、サーブレットとモデル両方で試してみる必要もあるかと思いますので。モデルで考える際には、あなた様のご回答の例プログラムを参考にさせていただきたいと思っております。
この度は、ご親切なご回答誠にありがとうございます。
とても助かりました。
あなた様を含め、ここでご回答して下さった方々には大変感謝しております。
ここ数日間、様々な方にアドバイスを頂きお世話になっております。
私は幸せ者です。今後も、何卒宜しくお願い申し上げます。

No.4
- 回答日時:
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を使うと次々に入っている数字が出てしまいますよね?ここのところを、もしよろしければ教えていただけませんでしょうか?
No.3
- 回答日時:
サーブレット という事は 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なのかは、話が複雑になりますので、今は何でもよいですので、方法やその記述の仕方等、教えてくださる方がおりましたら、お願いしたいと思っております。以上補足説明をさせていただきました。
No.1
- 回答日時:
ここで得られた "乱数" の利用目的が分かりませんが、【同じ数を出さない】といった操作を加えた時点で、それは乱数ではなくなってしまいます。
例えば、{1,2,3,4,5,6,7,8,9,10} の集合から、任意に1つの要素を取り出す、と言うようなことを考えなければならないと思います。
確かに、おっしゃるとおりかもしれません。
同じ数字を出さない時点で、乱数ではないな、と思っておりました。
あなた様がアドバイスしてくださった考え方でも試したいと思います。
今後結果がでましたら、補足のところに載せていただくかもしれません。アドバイスありがとうございました。
今後もよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
setAttribute(String, int)は適...
-
Androidで画面遷移ができません.
-
<forEach> 内で供給された "ite...
-
Xercesを使ったjavaでのXML解析
-
ある年月の前月(月の開始日)...
-
画像の位置指定の数字を変えて...
-
JTabbedPaneのタブが開かれてい...
-
System.err. printlnとSystem.o...
-
ループ処理の際、最後だけ","を...
-
オブジェクトの中のプロパティ...
-
動的配列が存在(要素が有る)か...
-
flush()とclose()について
-
IF関数でEmpty値を設定する方法。
-
C#から、C++で作成したdll内の...
-
java キーボード入力された値の...
-
C言語のポインターに関する警告
-
ORA-01858: 数値を指定する箇所...
-
yyyymmddからyyyy/mm/d...
-
EclipseでJava
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
「例外 *** は対応する try 文...
-
<forEach> 内で供給された "ite...
-
setAttribute(String, int)は適...
-
干支の計算で。。。
-
生年月日と今日の日付から年齢...
-
アプレットの動作テストができない
-
importするには java.io.*; imp...
-
アプレットでスクロールバーを...
-
JPanelについて
-
Java初心者ですが・・・
-
JTableでスクロールバーが表示...
-
main()メソッドが無いコード
-
Javaで常駐するソフトを作って...
-
どうしてもプログラムが動いて...
-
ActionForm form にnullが入っ...
-
JFrame の再表示を禁止したい。
-
Javaアプリケーションのアイコ...
-
javaでスタート画面を作ってい...
-
Java Applet での虫食い算での質問
おすすめ情報