2012-02-15 10 views
3

これは私の初めてのアプリケーションの構築であり、問​​題があります。私は乱数を生成するこのアプリを作っています。時にはそれは私に数を2回表示します。これは私が目指しているものではありませんので、重複しないで乱数が表示されるようにプログラムする方法はありますか? ランダムな整数のユニークなセットの生成

これはところで、私のコードです:

package rando.mizer; 

    import java.util.Random; 

    import android.app.Activity; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.EditText; 

    public class RandomizerFinalActivity extends Activity { 
     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      Button buttonGenerate = (Button)findViewById(R.id.button1); 
      final EditText aantalT= (EditText)findViewById(R.id.editText1); 
      final EditText laagsteT = (EditText)findViewById(R.id.editText2); 
      final EditText hoogsteT = (EditText)findViewById(R.id.editText3); 
      final EditText uitvoerT = (EditText)findViewById(R.id.editText4); 



      buttonGenerate.setOnClickListener(new Button.OnClickListener(){ 

       public void onClick(View arg0) { 
        final int aantal = Integer.parseInt(aantalT.getText().toString()); 
        final int laagste = Integer.parseInt(laagsteT.getText().toString()); 
        final int hoogste = Integer.parseInt(hoogsteT.getText().toString()); 

        uitvoerT.setText(""); 
        Random r = new Random(); 

        int aNumber; 
        String build = ""; 


       for(int i = 0; i < aantal; i++) { 
        aNumber = laagste + r.nextInt(hoogste + 1 - laagste); 
        build += aNumber + ",\n"; 
       } 

        uitvoerT.setText(build); 


       } 

      }); 
     } 
    } 
+1

ランダムはランダムですが、同じ番号を複数回生成することがあります。ループに数値を生成してセットに割り当てることができます。これにより、重複しないことが保証されます。 – vulkanino

+0

私たちは何人の数字を話していますか? – stryba

+0

乱数の正確な数はありません。アプリを使用している人は、どれくらいの数の乱数を持っているかをaantalTで言うことができます。私はこれを試しました: \t \t ArrayList dubbel = new ArrayList (); \t for(int i = 0; i Kelzaaa

答えて

-2
import java.util.Set; 

Set<Integer> mySet = new HashSet<Integer>(10); // do you know how many elements do you need? 
boolean elementNotThere; 
do { 
    int myInt = r.nextInt(hoogste + 1 - laagste); 
    elementNotThere = mySet.add(myInt); 
} while (! elementNotThere); 
+0

@JarrodRobersonそれを試していない、カップルまたはタイプミスがあるかもしれませんが、私は-1 – vulkanino

+0

@ JarrodRobersonに同意しないyatskevichと私に感謝します。建設的ではないあなたではありません。 – vulkanino

+1

幼児の声調を補うためのアップヴォーグ –

0

ここにあなたの問題は、あなたが常に同じシードを使用しているので、同じ番号を生成するチャンスは最初のあなたが理解する必要があり、非常に高いことですそれは純粋な乱数を生成することは不可能ですが、Javaがあなたに与えることはかなりまともなメカニズムですが、種に依存しています。

一般的な方法は、あなたがしなければ、そうミリ秒単位で現在の日付時刻を使用することです:

new Random(System.currentTimeMillis()) 

あなたが重複を取得しないことがわかります。あなたは、このコードでそれを試すことができます。

public static void main (String... args){ 
    for (int i=0; i<10000; i++){ 
     try { 
     Thread.sleep(100); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
     Random random = new Random(System.currentTimeMillis()); 
     System.out.println(random.nextInt()); 

    } 
} 
+2

これはまだ同じ順序ではない重複を生成します –

+0

こんにちはJarrod、あなたのコメントで私の答えに記載されていることを繰り返してくれてありがとう!それは素晴らしい仲間です!だから私たちに教えてください...実際のランダムジェネレータの解決策はありますか?多分あなたはそのノーブル賞を獲得することができます!明らかに、これはnunmbersのユニークなリストを生成しませんが、私はそれが重複を生成する前に私はかなりloooooooooooooooooongの時間のために実行するだろうとかなり確信しています...ほぼミリ秒はコールコールから行くという仮定に基づいている。 .. –

+0

Thread.sleep(100)を使用して10000回の繰り返しループでそれを実行し、何が重複していないかを推測してください。 –

0

あなたがランダム宝くじに例えば行われているように、既知のセットから繰り返さずに数字を選ぶしようとしているようです。セットが大きすぎないならば、このアプローチはうまくいくでしょう(カウントが数値の数よりも大きければ失敗することに注意してください)。

/** Will pick `count` numbers randomly from the set of numbers between 
* startNumber (included) and endNumber (excluded). */ 
public static Collection<Integer> randomPick(int startNumber, int endNumber, int count) { 
    // Generate a list of all numbers from start to endNumber 
    List<Integer> numbers = new ArrayList<Integer>(); 
    for(int i = startNumber; i < endNumber; i++) { 
     numbers.add(i); 
    } 

    // Shuffle them 
    Collections.shuffle(numbers); 

    // Pick count items. 
    return numbers.subList(0, count); 
} 
+1

'List'の代わりに' Set'を使うべきです。 –

+1

Setに対してCollections.shuffleを実行することはできません。 – ARRG

+0

それは意味をなさないです、単に設計によって重複を避ける 'Set'を使用してください。 – vulkanino

0

Collections.shuffleの使用は素晴らしいアイデアですが、すべての数字をシャッフルする必要はありません。

// return nNumbers distinct values from low to (high - 1) 
public List<Integer> getRandoms(int low, int high, int nNumbers) { 
    int range = high - low; 
    List<Integer> workArray = new ArrayList(range); 
    for (Integer i = low; i < high; i++) 
     workArray.add(i); 

    // Put the chosen values at the start of the array one by one 
    // (and then do not touch the start of the array). 
    int pseudoStartIndex = 0; 
    while (pseudoStartIndex < nNumbers) { 
     int randomIndex = pseudoStartIndex + 
          random.nextInt(range - pseudoStartIndex); 
     Integer tempSwap = workArray.get(pseudoStartIndex); 
     workArray.set(pseudoStartIndex, workArray.get(randomIndex)); 
     workArray.set(randomIndex, tempSwap); 
     pseudoStartIndex++; 
    } 
    return workArray.subList(0, nNumbers); 
} 

それは基本的にFisher-Yates shuffleだが、いくつかの要素だけに適用される:使用する方が効率的でしょう。

0

リスナーへの各呼び出しでランダムを作成するのではなく、ランダムオブジェクトを作成して(シード付きで)初期化する方がはるかに良いでしょう。重複する可能性は低くなります。

関連する問題