{CAB} = 4 次
{CBA} = 4 次
换言之,并不是所有排列的产生几率都相等。请注意,A 在第一个位置出现 9 次,B 在第一个位置出现 10 次,C 在第一个位置出现 8 次。如果在赌博游戏模拟中使用这种不正确的混排算法,则会产生严重的问题。
如果使用正确的混合算法,您最终可能得到的结果如图 4 中所示(注意 r 值从来不小于 i 值)。此时,这三个项目的六种可能的最终排列中每一种排列的产生概率都是相等的,某字母出现在某特定位置的概率也是相等的。同时还要注意,不需要进行第三次遍历,因为它只会与自己交换数组中的最后一个值。因此,正确算法中的循环可转到 animals.Length - 1 而不是 animals.Length。
返回页首
生成正态/高斯数字
我将在本月专栏中演示的第四种方法是从钟形分布(通常称为正态或高斯分布)中生成数字。
假设您要生成一些与一组人身高相对应的测试用例输入数据。可通过一种称为 Box-Muller 算法的非常巧妙的方法来生成正态分布的伪随机数字。用于创建图 1 中所示输出的代码的开头如下所示:
Gaussian g = new Gaussian();
double ht;
int outliers = 0;
Console.WriteLine("从平均值为 68.0 英寸、标准偏差为 6.0 英寸的" +
"正态/高斯分布生成 " +
"100 个随机身高 ->");
我以一个程序定义的高斯对象为例。此对象执行所有工作并使用 Box-Muller 算法。可变身高将受一个正态分布值的约束。我还会初始化一个计数器以跟踪非正常值,即那些远高于或远低于平均身高的值。跟踪非正常值使我起码可以验证我的随机身高事实上是正态分布的。图 5 列出了生成并显示我的随机身高的代码。
我每隔 10 个值就用模数 (%) 运算符打印一个新行,只是为了保持输出整齐。来自平均值为 68.0 英寸、标准偏差为 6.0 英寸的正态分布随机身高通过 Gaussian.NextGaussian2 方法的调用返回,我稍后将对此详细说明。我通过监控小于 56 英寸或大于 80 英寸的值来跟踪非正常值。这些值是高于或低于平均值 68.0 英寸两个标准偏差(6.0 * 2 = 12.0 英寸)的值。据统计,随机生成值超过平均值两个正(或负)标准偏差的概率大约有 5%。因此,如果生成 100 个随机身高(就像我现在这样),则可以预期约有 5 个非正常值。如果得出的非正常值远多于或远少于 5 个,则就需要仔细检查代码。请注意,在图 1 所示的运行示例中,我刚好得到 5 个非正常值,这使我更加确信我的随机生成的身高数据点实际上是正态分布的。
文章来源于领测软件测试网 https://www.ltesting.net/