2010-12-22 97 views
4

我不得不返回從我的數據庫隨機條目。你如何測試某些東西是隨機的?或「足夠隨機'?

我寫了一個功能,因爲我使用Python中random模塊,它可能是,除非我在一個愚蠢的方式使用它。

現在,我怎麼能寫一個單元測試,檢查該功能的工作原理呢?畢竟,如果它是一個很好的隨機值,你永遠無法知道。

我不是偏執狂,我的功能是不那個複雜的和Python標準庫是1000 x 時間足夠我的目的。我沒有做密碼學或關鍵的東西,我只是想知道如果th ere是一種方式。

+1

函數到底做了什麼? – 2010-12-22 15:55:05

+0

從數據庫中隨機獲取東西通常在數據庫*中完成,而不是python – 2010-12-22 18:40:03

回答

19

RANDOM.ORG for testing randomness上列出了幾項統計測試。請參閱鏈接文章的最後兩部分。

而且,如果你能得到的Beautiful Testing副本有由John D. Cook整整一章叫做測試隨機數發生器。他解釋了上面文章中列出的很多統計方法。如果你真的想了解RNG,那麼這一章是一個非常好的起點。我自己寫過關於這個主題的文章,但是John解釋它的工作做得更好。

2

您可以讓單元測試多次調用該函數,並確保碰撞次數合理地較低。例如。如果你的隨機結果在1-1000000的範圍內,則調用該函數100次並記錄結果;然後檢查是否有重複。如果有任何(或超過1次碰撞,取決於你是否有虛假的測試失敗),則測試失敗。 顯然不完美,但會抓住它,如果你隨機數是從Dilbert: http://www.random.org/analysis/

2

你有兩個糾結的問題。第一個問題是測試你的隨機選擇是否有效。種下你的PRNG可以讓你寫出一個確定性的測試,你可以斷言。這樣可以讓你對自己的代碼有信心,因爲基本功能可以履行其職責(即隨機返回足夠好的隨機值)。

你似乎關心的第二個問題是python的隨機函數。你想從音樂會中分離你的代碼關於隨機函數的問題。有一些randomness tests,你可以read about,但在一天結束時,除非你在做加密,否則我相信python開發者已經足夠了。

6

你真的不知道(看卡通)。

但是,您可以測量生成的樣本的entropy,並根據您期望的熵進行測試。正如之前提到的,random.org進行了一些相當聰明的測試。

alt text

0

除了以前的答案,您還可以嘲笑隨機函數(例如用mockmox庫),並返回,而您知道結果值的預定義的序列。是的,這對所有情況都不是一個真正的考驗,但是你可以測試一些角落案例。在某些情況下,這種測試可能是合理的。