1

宝くじの番号を生成するために乱数を使用しています。しかし、Javaのランダムジェネレーターを使用しようとすると

Random randomGenerator = new Random(System.currentTimeMillis());
int randomInt = randomGenerator.nextInt(totalsize);

currentTimeMillis をシードとして使用した後でも、これは純粋な乱数を生成しません。そのため、以前の乱数を保存し、古い乱数と比較してから新しい乱数を生成する必要があると考えています。これらの乱数はループでは生成されません。そのため、メモリまたはデータベースに保存されていない限り、それらを比較することはできません。

以前の乱数を保存するために、いくつかのオプションを考えています

-シングルトンを使用して保存します(どのように行うか、ソリューションがどれほど優れているかはわかりません)

-またはデータベースに値を保存する

-実装したくない3番目は、memcacheなどを使用することです。日付は保存する必要がある20個の数字しかないため、サーバーのメモリ制限のために過剰であり、オプションから外れています。

この一時データを格納するためにシングルトンまたはデータベースを使用する必要があります。IFシングルトン、どうやって?

私の要件は、10 個のリスト (10 種類の宝くじの種類ごとに 1 つ) を保存し、それらに 2 つの以前のランダム値を保存することです。

編集: Tomcat で実行されている Java Web アプリです。したがって、単純にリストを維持することはできません。クライアントがサーブレットにアクセスするたびに、乱数が生成されます。したがって、サーバーから乱数を送信する必要がありますが、これは前の 2 つの値で繰り返されません。

4

3 に答える 3

0

適切な乱数が必要な場合は、SecureRandom代わりにRandom... を使用するだけで、適切なシステムレベルのエントロピーソースからシードされるようにする必要があります。

「貧弱な」乱数ソースからの数値を以前に生成された数値と比較しても、問題は解決しません。数字は依然として偏りがあり、予測可能です。


一方、本当の目的が 3 つの異なる数値を生成することである場合1、クライアント側のブラウザー Cookie またはサーバー側のセッション オブジェクトのいずれかを使用して、重複排除を実装することをお勧めします。後者の場合、おそらく情報を永続化する必要はありません。ユーザーが 3 つの番号すべてを取得するのに時間がかかりすぎる場合は、残念です。

1 - 厳密には、これは乱数のシーケンスではありません。これは、重複を排除すると非ランダム性の要素が導入されるためです。

于 2013-06-09T06:16:58.023 に答える
0

私はあなたが正確に何を望んでいるのかわかりません.値を一時的に保存するだけなので、10個のリストを持つという要件の一部であると言うように、配列リストに値を保存しないのはなぜですか.リスト内の番号などで。

例えば

    List<Integer> list1 = new ArrayList<>();

    int count=10;
    int random =randomGenerator.nextInt(totalsize);
    While(count>0)
    {
     if(list1.contains(random))
       continue;
      else
      { 
       list1.add(random );    
        --count;
      }
    }

10 の異なる番号のリストがある場合、別のリストを作成する場合、番号を生成する場合、現在のリストに追加されていない場合は、番号が前のリストにあるかどうかを確認します

これがあなたのやりたいことかどうかはわかりませんが、提供された情報から収集できることのほとんどと、問題の説明があまり明確ではないので、私が助けてくれることを願っています;)すべてのデータをデータベースに保存します

于 2013-06-08T23:55:17.133 に答える