2011-09-14 8 views
0

私はサイズxの配列を持っています。リストをランダムに移動する必要がありますが、各要素に一度到達する必要があります。これを行う最も効率的な方法は何ですか?あなたが探しているものをJava:配列をランダムに移動する方法は?

+1

[一覧からn個のランダムな要素を取る?](http://stackoverflow.com/questions/4702036/take-n-random-elements-from-a-liste) – templatetypedef

+0

'の可能重複なく、各要素に一度到達する - これは、各要素を1回だけ取得することを意味しますか?シャッフル後に再びその要素を取得しないでください。 – Rakesh

+0

@Rakesh、はい私は各要素を一度しか取得しません。 – dee

答えて

8

がthis-

// Create a list 
List list = new ArrayList(); 

// Add elements to list 

// Shuffle the elements in the list 
Collections.shuffle(list); 

// Create an array 
String[] array = new String[]{"a", "b", "c"}; 

// Shuffle the elements in the array 
Collections.shuffle(Arrays.asList(array)); 
3

だけshuffle配列を試してみて、それを反復シャッフルです。

Collections.shuffle(Arrays.asList(yourArrayReference)); 
+0

コレクションが定義されていません。コレクションとは何ですか? – BenRacicot

+1

[Javaコレクション](https://docs.oracle.com/javase/tutorial/collections/)。特にアルゴリズムのセクションを見てください。 – Mahesh

0

あなたは、ほとんどのオブジェクト指向言語では、デフォルトでは一般的に利用可能である乱数生成器を使用し、すでに確認何を追跡するために、二番目の配列を使用することができます。

基本的に:

  1. その後、確認...
  2. ...乱数がチェック済みの配列になっていない場合乱数
  3. のための主要な配列を検索
  4. 乱数を生成します要素配列[ランダム]
  5. 既にチェックされている配列の最後に乱数を追加する
2

これは、時間と空間を効率的に行う方法です。

import java.util.Enumeration; 
import java.util.Random; 

public class RandomPermuteIterator implements Enumeration<Long> { 
    int c = 1013904223, a = 1664525; 
    long seed, N, m, next; 
    boolean hasNext = true; 

    public RandomPermuteIterator(long N) throws Exception { 
     if (N <= 0 || N > Math.pow(2, 62)) throw new Exception("Unsupported size: " + N); 
     this.N = N; 
     m = (long) Math.pow(2, Math.ceil(Math.log(N)/Math.log(2))); 
     next = seed = new Random().nextInt((int) Math.min(N, Integer.MAX_VALUE)); 
    } 

    public static void main(String[] args) throws Exception { 
     RandomPermuteIterator r = new RandomPermuteIterator(100); 
     while (r.hasMoreElements()) System.out.print(r.nextElement() + " "); 
    } 

    @Override 
    public boolean hasMoreElements() { 
     return hasNext; 
    } 

    @Override 
    public Long nextElement() { 
     next = (a * next + c) % m; 
     while (next >= N) next = (a * next + c) % m; 
     if (next == seed) hasNext = false; 
     return next; 
    } 
} 
+0

これは非常に読みにくく、恐ろしいコードです。 5分後、私はまだ何が起きているのか分かりません。しかし、実際にアレイを通過する場合(OPの質問のように)、アレイは非常によく隠されていなければなりません。また、この質問はすでに4年前に答えられました。 –

+0

配列のインデックスを擬似ランダムに列挙します。例えば上記のコードを実行すると、50のようなものが得られます52 3 6 45 40 26 49 92 11 80 2 4 19 86 61 65 44 27 62 5 32 82 9 84 35 38 77 72 7 ...インデックス0..99。 – aykutfirat

+0

良いこと、ありがとう – msangel

関連する問題