アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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();
}
}

この回答への補足

なるほど。あの変な質問ですが・・・もしなんですが、サーブレットでこのような定義をしたら、リクエストがあるたびにまたいちから数値をランダムにして取り出すので、同じ数字がでてしまいますよね。?恐らくそのようになると思うのですが・・・・。

補足日時:2007/12/26 10:33
    • good
    • 0

>なるほど。

あの変な質問ですが・・・もしなんですが、サーブレットでこのような定義をしたら、リクエストがあるたびにまたいちから数値をランダムにして取り出すので、同じ数字がでてしまいますよね。?恐らくそのようになると思うのですが・・・・。

そうですね。そうなると思います。
私はサーブレットは詳しくないので、サーブレットでどのような手法を用いるのが適切かはわかりませんが、
一般論としては乱数列をあらかじめファイルなどに用意しておき、
リクエストがあるたびにファイルから乱数を取り出し、
消費した乱数を消去する、というような手順をとることになるかと思います。
    • good
    • 0
この回答へのお礼

なるほど。確かにそのようにも考えられますね。
わかりました。皆様からのアドバイスをもとに、もう少し考え、まとめてみます。恐らく、サーブレットとモデル両方で試してみる必要もあるかと思いますので。モデルで考える際には、あなた様のご回答の例プログラムを参考にさせていただきたいと思っております。
この度は、ご親切なご回答誠にありがとうございます。
とても助かりました。
あなた様を含め、ここでご回答して下さった方々には大変感謝しております。
ここ数日間、様々な方にアドバイスを頂きお世話になっております。
私は幸せ者です。今後も、何卒宜しくお願い申し上げます。

お礼日時:2007/12/27 09:11

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を使うと次々に入っている数字が出てしまいますよね?ここのところを、もしよろしければ教えていただけませんでしょうか?

補足日時:2007/12/26 09:14
    • good
    • 0

サーブレット という事は 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なのかは、話が複雑になりますので、今は何でもよいですので、方法やその記述の仕方等、教えてくださる方がおりましたら、お願いしたいと思っております。以上補足説明をさせていただきました。

補足日時:2007/12/26 05:29
    • good
    • 0

整数値の順序数をArrayListなどに入れて、Collections.shuffle()メソッドでシャッフルします。

それをArrayListの先頭から順に使います。
    • good
    • 0
この回答へのお礼

専門家はやはりさまざまことご存知ですね。
そのような方法があるとは。
あの、お手数ですが、先ほどのアドバイスを付け加えるとしたら、
私のプログラムをどのように記述したらよいか、例を打っていただけませんでしょうか?
これは無理な頼みですので、だめな場合はご回答はなさらなくて大丈夫です。

お礼日時:2007/12/25 15:45

ここで得られた "乱数" の利用目的が分かりませんが、【同じ数を出さない】といった操作を加えた時点で、それは乱数ではなくなってしまいます。



例えば、{1,2,3,4,5,6,7,8,9,10} の集合から、任意に1つの要素を取り出す、と言うようなことを考えなければならないと思います。
    • good
    • 1
この回答へのお礼

確かに、おっしゃるとおりかもしれません。
同じ数字を出さない時点で、乱数ではないな、と思っておりました。
あなた様がアドバイスしてくださった考え方でも試したいと思います。

今後結果がでましたら、補足のところに載せていただくかもしれません。アドバイスありがとうございました。
今後もよろしくお願いいたします。

お礼日時:2007/12/25 16:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!