2011-02-04 8 views
5

私のプロジェクトの一環として、数字のセットを与えることで、非繰り返しの2桁または3桁の乱数を作成する必要があります。リストや配列を実装する必要はありません。関数呼び出しごとに1つの乱数を取得する必要があるからです。反復しない乱数

私はSecureRandomクラスのJavaを使用してそれを試みました。私はいくつかのサイトからも助けを得ましたが、私は間に詰まっています。私たちはVALUESをシャッフルして完了させることができますか?しかし、私はそれがどのように行われるのか分かりません。誰でも助けてくれますか?

import java.security.SecureRandom; 
public class RandomNumber { 
private static final RandomNumber rnd= new RandomNumber(); 

    private static final char[] VALUES = new char[] { 
      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 
    private static final SecureRandom srn= new SecureRandom(); 
    public String createID() 
    { 
     byte[] bytes = new byte[3]; 
     srn.nextBytes(bytes); 

    } 
+1

番号内の数字は、繰り返しでない数字か、結果の2桁または3桁の数字ですか?あなたのシャッフルの質問は前者を示唆していますが、後者は宿題のように聞こえるでしょう。 –

+0

以降の数字と同じように非繰り返しは同じか、グローバルに繰り返されませんか? – biziclop

+0

No..Paul ....番号内の数字は繰り返すことができます...しかし、各呼び出しで生成される数字は一意でなければなりません。(例:331は可能ですが、331は2番目に生成すべきではありません時間...) – vidhya

答えて

12

Fisher-yates shuffle algorithmです。効率的なシャッフル。 と線形時間で動作します。かなり高いものよりも、[]の値の低い要素を交換する可能性が高い場合Manojさんのコード反復ここ

はALGO

To shuffle an array a of n elements: 
    for i from n − 1 downto 1 do 
     j ← random integer with 0 ≤ j ≤ i 
     exchange a[j] and a[i] 

とコード

for(int i=VALUES.length-1; i>0; i--){ 
      int rand = (int) (Math.random()*i); 
      char temp = VALUES[i]; 
      VALUES[i] = VALUES[rand]; 
      VALUES[rand] = temp; 
    } 
+0

ありがとうManoj ...しかし、上記のプログラムの出力は配列..ライト..?私は毎回各関数呼び出しの単一の値を得ることができます..? – vidhya

+0

@vidhya:〜1000の値をすべて配列に入れ、シャッフルします。それでは、これまでにいくつの数値を生成したかを追跡するために変数を保持し、シャッフルされた配列内の次の数値を取得し続けるだけです。 –

-2

あります。例:i = 9の場合、アレイのメンバー(それ自身を含む)と交換する確率は1/10です。そして、i = 8の場合、Math.random()* iは0から8にしか及ばないので、再びVALUES [9]と交換することはできません。これは、VALUES [9]が元のVALUES [9]他の要素はそれぞれの要素と等しくなります(iが小さくなるにつれてスワップする可能性が高くなります)。

私は単純に配列の要素を重み付けないように上記の解答を修正したいと思います:(あなたが好きなようやな回数)

for(int i=0; i <= VALUES.length - 1; i++){ 
     int rand = (int) (Math.random()*(VALUES.length-1)); 
     char temp = VALUES[i]; 
     VALUES[i] = VALUES[rand]; 
     VALUES[rand] = temp; 

今シャッフルが行われVALUES.length時間をしていません配列の特定の要素を優先します。

+2

実際、あなたの "バグ修正"にはバグがあります。これは、ウィキペディアでさえ(議論されている)(http://en.wikipedia.org/wiki/Fisher-Yates#Implementation_errors)さえあるという一般的な誤解です。 – meriton