即是說: 隨機序列 = F(算法, 種子)
說到隨機數的產生不得不提的是我們的隨機數發生器往往是可以預測的。例如我們常用的隨機rand 函數就是一個可以預測的。 [Page]
int __cdecl rand (void )
{
return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
}
在這個的背后其實是用的是Knuth pseudo-random number-generating 技術。Knuth 在這本書中\"Seminumerical Algorithms,\" Vol. 2 of The Art of Computer Programming (Addison-Wesley, 1981)發表了這個算法。在實際的應用中我們如何產生適合應用的隨機數是根據實際情況定的。比如我們在輸入參數的安全性方面沒有任何先驗知識的情況下,均勻分布是比較好的。在有先驗知識或者是白盒測試的情況下正態分布可能是比較好的隨機數分布。
這些分布的產生一般都是先產生一個平均分布然后求對應分布的逆。網上能找到一堆偽隨機數生成器的代碼。下面就隨便給一個。如何產生一個更好的偽隨機數,以后再說吧。
1double AverageRandom(double min,double max)
2{
3
4 int minInteger = (int)(min*10000);
5 int maxInteger = (int)(max*10000);
6 int randInteger = rand()*rand();
7 int diffInteger = maxInteger - minInteger;
8 int resultInteger = randInteger % diffInteger + minInteger;
9 return resultInteger/10000.0;
10}
11double Normal(double x,double miu,double sigma)
12{
13 return 1.0/sqrt(2*PI*sigma) * exp(-1*(x-miu)*(x-miu)/(2*sigma*sigma));
14}
15double NormalRandom(double miu,double sigma,double min,double max)
16{
17 double dResult;
18 double dScope;
19 double dNormal;
20 do
21 { 22 dResult = AverageRandom(min,max);
23 dScope = AverageRandom(0,Normal(miu, miu, sigma));
24 dNormal = Normal(dResult, miu, sigma); [Page]
25 }while( dScope > dNormal);
26 return dResult;
27
28}
29
產生了隨機數以后,參數進行適當的組合對對應的API函數進行測試,這樣就能在數學上保證盡可能得覆蓋到對應得參數空間。最大可能的找到bug。
對于白盒測試來講這種測試方法就更加適合,因為可以找一些比較合適的值作為初始值然后再產生隨機的參數,就可以更有針對性的找到bug。
其實這是一種測試-FUZZ testing 的基本思想.
a,b,c所組成的參數空間中的 一個 特殊的 取值范圍內即當0<a<100 ,b=0,c=255這個特殊 空間的時候會觸發一個特殊的bug.當然實際的情況要比這種情況復雜的多。但是總會隱藏著類似的bug.
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/