2012-12-12 50 views
0

所以我想測試是否是隨機生成的整數序列,但它不工作... 這是我到目前爲止有:如何測試一個整數序列是否是隨機生成的?

public static void main(String[] args) { 
    Random r = new Random(); 
    int[] sequence = { r.nextInt(), r.nextInt(), r.nextInt() }; 
    System.out.println(isRandomSequence(sequence)); 
} 

public static boolean isRandomSequence(int[] sequence) { 
    for (long seed = 0; seed < Long.MAX_VALUE; ++seed) { 
     Random r = new Random(seed); 
     long tries = 0; 
     for (int i = 0; tries < Long.MAX_VALUE; ++tries) { 
      if (sequence[i] == r.nextInt()) { 
       if (++i == sequence.length) return true; 
      } else { 
       i = 0; 
      } 
     } 
    } 
    return false; 
} 

編輯:澄清;我想知道,例如序列{4,5,6}是否由隨機數生成器生成。對於將測試限制在java.util.Random中的初學者來說(如果可能的話,將會有很好的通用解決方案)。

+3

你能更具體地說'它不工作'嗎? –

+0

你能爲我們定義你的可接受的隨機性度量嗎? – nwaltham

+5

你意識到內循環的主體將被執行85070591730234615847396907784232501249(〜8.5e37)次? – NPE

回答

2

隨機只有2^48種子。這意味着你「只」需要從一開始就探索2^48種子。不再。

所有這一切,探索2^48種子將需要數小時或數天運行。

由於這是非常消耗CPU,你可以看看使用你所提供的的CPU;)

+0

那麼我怎麼知道什麼種子去測試?你能舉個例子嗎? – Turtlefish

+0

你可以重複地調用setSeed從0到2^48-1 –

0

我想你想的種子不正確的工作方式。這也許可以解釋爲什麼你沒有得到隨機序列。

你不會每次都播種。您可以在流程開始時使用種子實例化Random並掛上它。

如果你在方法調用中創建一個Random,每當你想要一個序列時都帶有一個新的種子,你肯定會這麼做錯誤

我敢打賭,這個工程:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.util.Random; 

/** 
* RandomSequenceGenerator 
* @author mduffy 
* @since 12/12/12 4:38 PM 
*/ 
public class RandomSequenceGenerator { 

    private Random random; 

    public static void main(String[] args) { 
     RandomSequenceGenerator generator = new RandomSequenceGenerator(); 
     int numSequences = ((args.length > 0) ? Integer.valueOf(args[0]) : 10); 
     int lenSequence = ((args.length > 1) ? Integer.valueOf(args[1]) : 3); 
     for (int i = 0; i < numSequences; ++i) { 
      System.out.println(generator.createRandomSequence(lenSequence)); 
     } 
    } 

    public RandomSequenceGenerator() { 
     this(System.currentTimeMillis()); 
    } 

    public RandomSequenceGenerator(long seed) { 
     this.random = new Random(seed); 
    } 

    public synchronized List<Integer> createRandomSequence(int length) { 
     List<Integer> sequence = new ArrayList<Integer>(length); 
     for (int i = 0; i < length; ++i) { 
      sequence.add(this.random.nextInt()); 
     } 
     return sequence; 
    } 
} 
4

除了是棘手的,你的蠻力技術將只檢測由java.util.Random生成的僞隨機序列,遠遠不是唯一的選擇,以產生僞隨機數。還請注意單詞:它們並不是真正的隨機,這就是爲什麼你認爲你可以檢測到序列。

檢測一個序列是否真的是隨機的在理論上是不可能的:你可以做的最好的是執行一系列的模式檢測測試,以消除某些的可能性。總會有非隨機序列逃避檢測。

我也應該注意,關於一個只有三個整數的序列肯定沒有什麼可說的。我很確定java.util.Random的輸出包含所有可能的三整數序列。

+0

Pseudo yes,但是能夠產生足夠多的隨機序列。我認爲現有的Random是綽綽有餘的。這個問題對它的工作原理以及對生成序列的不好的理解很不瞭解。 – duffymo

+0

@duffymo - 他不是試圖產生 - 他試圖測試! – DrC

+0

我明白了,但我猜測他想測試,因爲他嘗試了一個有缺陷的實現。而不是懷疑他的隨機序列生成代碼,他假定Random類是錯誤的,需要驗證。 – duffymo

相關問題