測試中的隨機性(2)

發表于:2014-08-25來源:uml.org.cn作者:Dr. James McCaffrey點擊數: 標簽:軟件測試
這很容易從某數組生成一個隨機選取項: string[] items = new string[] { alpha, beta, gamma, delta }; Console.WriteLine({ alpha, beta, gamma, delta } 的 + 隨機成員是 + items[objRan

  這很容易從某數組生成一個隨機選取項:

string[] items = new string[] { "alpha", "beta", "gamma", "delta" };
Console.WriteLine("{ 'alpha', 'beta', 'gamma', 'delta' } 的" +
"隨機成員是 " +
items[objRan.Next(items.Length)] );

  如果數組大小為 N,則調用 objRan.Next(N) 所生成的返回值將是值域 [0, N-1] 內的一個整數(該值域完全對應于數組的索引值)。請注意,該方法也可用于 ArrayList 對象,而且事實上也可用于任何以 0 為基數的索引化集合。

  在后臺,重載的 Random.Next 方法將使用 Knuth 偽隨機數字生成方法。這也稱作“相減法”。Knuth 在《The Art of Computer Programming》(計算機程序設計藝術)(Addison-Wesley, 1981) 第 2 卷的“Seminumerical Algorithms”(半數值算法)中發表了此算法。生成統一的偽隨機數字相當有難度,但幸好 .NET Framework 會負責為您實現 Knuth 算法。

  大約在首次開發 .NET Framework 時,Matsumoto 和 Nishimura 就發現了一種新的偽隨機數字生成算法。他們的算法一般被稱作 Mersenne Twister(馬其賽特旋轉)方法,并正因其通常所具有的卓越性能和數學特性而迅速取代原來的偽隨機數字生成算法。請參閱“Mersenne Twister:A 623-Dimensionally Equidistributed Uniform Pseudo-Random Number Generator”,《ACM Transactions on Modeling and Computer Simulation》(美國計算機學會模型和計算機仿真匯刊),第 8 卷,第 1 號,1998 年 1 月。

  生成偽隨機浮點數與生成偽隨機整數類似。假定有以下代碼:

double x = (6.25 * objRan.NextDouble()) + 1.50;
Console.WriteLine("[1.50,7.75) 值域中的隨機雙精度值是 " +
x.ToString("0.00"));

  對 Random.NextDouble 的調用將返回一個大于或等于 0.0 且絕對小于 1.0 的數字。要生成在值域 [下限值,上限值) 之內(其中,兩個括號符號表示大于或等于“下限值”且絕對小于“上限值”)的浮點型數字,則可使用小型公式:

double result = ((high-low) * objRan.NextDouble()) + low;

  因為除 0.0 外,大多數浮點型數值都為近似值,所以從技術上說,您不能在包含端點值的值域 [下限值,上限值] 內生成浮點型數字,而必須將其改為不包含端點值的值域 [下限值,上限值)。該公式與接受完整值域的 Next 重載中所用的公式幾乎相同,只不過轉換為整數的結果不同。

返回頁首

  分析模式隨機性

  有時候,您可能需要檢查某個測試用例輸入或輸出模式,以證明它是隨機生成的(例如,檢驗并確定某一賭博模擬事實上正輸出隨機結果)。有幾個統計方法可用于實現此目的,但最簡單的是 Wald-Wolfowitz 檢驗。該檢驗有時稱為單樣本游程檢驗(其中,“游程”為一連串相同數字或字符)。Wald-Wolfowitz 檢驗適用于由兩個符號組成的序列,例如:

  A B B A A A B B B A B B

  其中的原理是,對于模式中指定數量的每個符號類型(共兩個符號類型),如果符號為隨機生成(在本例中,意味著模式中每個位置出現 A 或 B 的幾率各為 50%),則您可計算該模式中的預期游程數。模式游程是一個由相同符號類型組成的序列。因此,在剛才所示的模式中,共有六個游程:A、BB、AAA、 BBB、A、BB。如果模式中的實際游程數過大或過小,則證明該模式不是隨機生成。

  盡管 Wald-Wolfowitz 檢驗僅適用于只包含兩種符號類型的模式,但您通??梢詫⑷我饽J接成錇?Wald-Wolfowitz 形式。例如,如果您有一個 {7, 9, 3, 4, 1, 6} 之類的整數序列,則可以算出其平均值為 (5.0),然后將該序列映射到符號 H 和 L,其中 H 代表大于該平均值的數,而 L 代表小于該平均值的數:H H L L L H。如果您需要分析更復雜的模式,則可以使用 Chi-Square 檢驗或 Kolmogorov 檢驗之類的一些檢驗方法。

  現在,讓我們假設 n1 是某模式中第一種符號的數量,而 n2 是第二種符號的數量。則隨機生成模式中的預期游程數 μ 為:

μ = 1 + ((2*n1*n2) / (n1 + n2))

原文轉自:http://www.uml.org.cn/Test/200611225.htm

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97