除非您正在編寫一個實際的隨機數生成器或某種依賴於安全隨機數生成器的加密庫,否則不需要檢查隨機數生成器是否存在偏差。這是隨機數字生成器的作者的工作。
Collections.shuffle()
的例子也是一個不好的例子,因爲它是一個內置的JDK方法。沒有理由測試內置的JDK方法,Java的作者已經爲您做了這些工作,加上過去20年來使用這些方法的數百萬用戶。您是否也有測試來確認System.out.print()
的工作是否如預期的那樣?
單元測試應該是確定性的。每次重複運行相同的測試應該每次都會產生相同的結果。如果他們不這樣做並且測試失敗,是否因爲代碼錯誤或因爲非確定性輸出產生無效輸入而失敗?如果重新運行結果,測試通過,是因爲錯誤是固定的,還是因爲我們偶然得到了隨機輸入?
由於這些原因,您的單元測試應該嘗試模擬或者刪除任何隨機性。也許寫幾個測試來執行數據的特定轉換以測試邊界條件。例如,對於shuffle()
可能有一個測試,按特定順序對元素進行重新排序,或者按照升序或降序對元素進行排序,或者對某個測試沒有進行任何轉換等。這些都是可以隨機發生的有效結果。
這種方式每次測試都會爲相同的輸入產生相同的輸出,並且您可以從不同的結果中獲益。
編輯 看來你真的想測試你自己的隨機數發生器。
這裏是描述統計檢驗環節,你應該做的,看看它是否真的是隨機的(或至少儘可能的隨機)
RANDOM.ORG statistical analysis
NIST statistical test suite
http://stackoverflow.com/questions/56411/how-to-test-random-case-in-point-shuffling –
stackoverflow.com/questions/56411/...是關於洗牌。這是這個問題的一個子部分。 –
@AlexandreSantos爲什麼對於這個問題的接受答案仍然適用? – awksp