随机序列
生成“随机”测试向量,

引言
假设您需要测试一段软件,该软件期望一组以特定方式变化的值,但您希望生成长的测试序列并能够重复它们以进行调试。 在这种情况下,您需要类似随机数生成器的东西,它不是随机的,而是一个随机序列生成器。
“rand
”函数提供的值通常是根据时钟计算的,因此没有 rand 结果直接映射到时间,并且该值每次都不同并且看起来是随机的。 实际上,它是一个序列,它以隐藏的方式进行播种和重新播种。 因此,“rand”并不总是对测试某些东西有用。
背景
这种风格的算法可以用来为 IPv4 地址、数字滤波器、图像跟踪等创建易于重复的测试。有了它,您可以创建一个测试平台,并逐个计算地、逐个 if 语句地进行具体的例子计算。之后,您可以更改“种子”值来创建一个全新的测试用例并寻找极端情况。例如,您可以运行 10 万个测试,并让您的测试框架输出失败测试的种子值,然后使用调试器中的日志记录运行这些测试。
Using the Code
该代码使用起来相对容易,只需创建一个类实例,然后向该类请求下一个值。
Random r = new Random();
r.Seed = (long)numericUpDown1.Value;
double randomDouble = r.NextDouble; // Random double between 0 and 1.
r.NextGuass_Double(5, 1.5); // A value of 5 +/- 1.5 std dev. (gaussian).
r.NextFlat_Int(100, 150); // A random value between 100 and 150.
要求
当然,这些都是非正式的要求,但值得列出。
- 随机游走(无明显模式)序列
- 值的随机分布(平坦直方图)
- 如果种子相同,则序列重复
- 运行时间足够快
- 简单地支持各种类型(
byte
、char
、int
、float
等) - 支持计算最小值和最大值之间的随机值(白色,又名平坦噪声)
- 支持高斯噪声(类似测量的噪声)
设计
关键是制作一个随机生成器并扩展它以用于所有接口,而不会破坏它。
以下是一个哈希,即我们从中提取位的数值的随机化。
protected virtual ushort compute_NoSeedChange()
{
// This is a simple hash, and it's fast.
long[] v = {0x73ae2743a3eab13c, 0x53a75d3f2123bda1, 0x42a3bcba71a72843};
long rv = Seed;
for (int i = 0; i < v.Length; i++)
{
rv += v[i];
rv -= rv << 3;
rv ^= (v[i] >> 7);
rv ^= rv >> 11;
}
return (ushort)(rv & 0xFFFF);
}
测试
源代码测试包使用 .NET 图形数据可视化类来提供一个简单的基本测试框架。1. 随机游走(无明显模式)序列
如果序列有重复的趋势,值的散点图会变得斑驳或有模式,或者直方图会有一个模式,因为某些值会被命中的次数多于其他值。
以下前两张图片是失败的(在开发期间),但第三张(完成的代码)通过了。

2. 值的随机分布(平坦直方图)
给定足够的值,直方图应该看起来是平坦的,并且当使用不同的种子重复时,也看起来是平坦的,但形状略有不同。

3. 如果种子相同,则序列重复。
5. 简单地支持各种类型(byte、char、int、float 等)。
6. 支持计算最小值和最大值之间的随机值(白色,又名平坦噪声)。
3、5、6 通过检查进行了测试。
4. 运行时间足够快。
字节 10 万 0.5 秒 1 = 0.005 毫秒
双精度 1 万 0.2 秒 1 = 0.02 毫秒
高斯 10 万 3.2 秒 1 = 0.032 毫秒
这已经足够快了,留给读者自己优化,如果他们想这样做的话。
7. 支持高斯噪声(类似测量的噪声)
有足够的样本(100,000),直方图(黑线)应该保持平坦。对于随机高斯分布,它应该看起来像一个钟形曲线,在 +/- 3 个标准差内迅速下降。以下是 5,+/- 1.5 = 1 个标准差(1 sigma = 1.5)

这意味着大约 63% 的值应该存在于 3.5 和 6.5 之间,并且大约完全包含在 3 sigma (99%) 中,中心峰值在 5。红线是理想值,黑线是代码产生的值。 随机双精度到正确分布的累积概率分布重新映射本来可以完成,但代码平均了四个随机值,这反过来创建了类似高斯的分布。
待办事项
我以前在 C++ 中做过这个,但记不清楚我怎么做的了,只花了几天时间就完成了。这些事情留给读者娱乐。
- 让它更快。
- 为形状分布添加 CDF 风格的分布(泊松分布等)。