Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 带条件的概率分布的单元测试_Unit Testing_Testing_Probability_Probability Distribution - Fatal编程技术网

Unit testing 带条件的概率分布的单元测试

Unit testing 带条件的概率分布的单元测试,unit-testing,testing,probability,probability-distribution,Unit Testing,Testing,Probability,Probability Distribution,我有一个函数choose(elems)->elem,它调用rand(),这使得它不具有确定性 为了更好地测试它,我想我可以把这个函数一分为二 generate_choices(elems, ...) -> distribution choose(distribution) -> elem 其中choose()。然后我可以确定地测试这个概率分布是否如预期的那样 分布是均匀的,但有两个条件: 如果没有足够的元素,则统一添加一个随机回退元素 如果仍然没有足够的元素,则统一添加一个随机默认

我有一个函数
choose(elems)->elem
,它调用
rand()
,这使得它不具有确定性

为了更好地测试它,我想我可以把这个函数一分为二

generate_choices(elems, ...) -> distribution
choose(distribution) -> elem
其中
choose()。然后我可以确定地测试这个概率分布是否如预期的那样

分布是均匀的,但有两个条件:

  • 如果没有足够的
    元素
    ,则统一添加一个随机回退元素
  • 如果仍然没有足够的
    元素
    ,则统一添加一个随机默认元素
  • 一些例子:

    generate_choices([a, b, c, d], [], []) -> [a, b, c, d]
    generate_choices([a, b, c], [fallback1], []) -> [a, b, c, fallback1]
    generate_choices([a, b, c], [fb1, fb2], []) -> [a, b, c, (fb1 | fb2)]
    generate_choices([a, b], [fb1, fb2], [default1]) -> [a, b, (fb1 | fb2), default1]
    generate_choices([a, b], [fb1, fb2], [d1, d2]) -> [a, b, (fb1 | fb2), (d1 | d2) ]
    generate_choices([a], [fb1, fb2], [d1, d2]) -> [a, (fb1|fb2), (d1|d2) ]
    
    那么,我的问题是:我应该如何建模
    发行版

    • 如果我选择一个简单的列表,并从
      generate_choices()
      中调用
      rand()
      来填充回退和默认值,那么我只能测试
      generate_choices()
      的某些确定性部分
    • 如果我选择三个列表,
      (elems,fallback,default)
      ,那么
      generate\u choices()
      是完全确定的,但是
      choice()
      变得不那么琐碎,无论如何都必须进行更彻底的测试

    至少有两种方法可以测试使用随机数的函数。您可能希望同时进行这两种测试

    (1) 一种是设置随机数发生器的初始状态并生成一些示例,并通过检查验证示例是否正确。然后将这些示例作为预期输出放入测试脚本中,并在脚本开始时设置相同的初始状态

    (2) 另一种测试是生成大量示例,并验证这些示例平均满足预期的属性。这是一个非确定性测试,因为对于随机数生成器生成的某些序列,测试可能会失败。你将不得不接受一些小的失败概率;好消息是,通过测试大量示例并使测试的容差足够大,可以使概率足够小

    (2a)例如,在您给出的最简单的情况下,输入是一个序列,输出是该序列的排列。如果生成大量示例,您应该会发现所有排列的频率都相同,在一定的容差范围内。显然,这个测试受到测试输入长度的限制,因为有n!长度为n的输入的置换

    通过考虑每个不同排列的比例分布,可以得出公差。每个置换的概率为1/n!,每一个的期望数是(m乘以1/n!),其中m是生成的置换数。每个排列数的方差为(m乘以1/n!乘以(1-1/n!)),标准偏差为其平方根。可以将公差间隔近似为(预期数字加上或减去标准偏差的倍数)。通过更仔细地考虑分布,可以得到更精确的间隔

    (2b)测试排列的另一种方法是查看输出的第一个元素等于输入的第一个元素的次数,输出的第一个元素等于输入的第二个元素,输入的第一个元素等于输入的第三个元素,…,输入的第二个元素,…,第三个元素。。。输入的最后一个元素。这可能适用于比测试2a更长的序列。同样,游戏是计算每个箱子中预期数字的分布,并从中得出一个公差