Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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
如何使用随机种子值在Python中对PRNG进行单元测试?_Python_Random - Fatal编程技术网

如何使用随机种子值在Python中对PRNG进行单元测试?

如何使用随机种子值在Python中对PRNG进行单元测试?,python,random,Python,Random,我对编程还是相当陌生,只是学习如何进行单元测试。我需要测试一个返回随机值的函数。到目前为止,我已经找到了建议使用特定种子值的答案,这样“随机”序列是恒定的,可以进行比较。到目前为止,我得到的是: 这是我要测试的功能: import random def roll(): '''Returns a random number in the range 1 to 6, inclusive.''' return random.randint(1, 6) 这是我的单元测试: class

我对编程还是相当陌生,只是学习如何进行单元测试。我需要测试一个返回随机值的函数。到目前为止,我已经找到了建议使用特定种子值的答案,这样“随机”序列是恒定的,可以进行比较。到目前为止,我得到的是:

这是我要测试的功能:

import random

def roll():
    '''Returns a random number in the range 1 to 6, inclusive.'''
    return random.randint(1, 6)
这是我的单元测试:

class Tests(unittest.TestCase):

    def test_random_roll(self):
        random.seed(900)
        seq = random.randint(1, 6)
        self.assertEqual(roll(), seq)
如何在函数中为PRNG设置相应的种子值,以便在不将其写入函数本身的情况下对其进行测试?或者这完全是测试随机数生成器的错误方法


谢谢

通过将一个已知种子植入prng,您知道它将产生哪个序列,因此您可以测试该序列:

class Tests(unittest.TestCase):
    def test_random_roll(self):
        random.seed(900)
        self.assertEqual(roll(), 6)
        self.assertEqual(roll(), 2)
        self.assertEqual(roll(), 5)

其他答案都是正确的。在这里,我要回答一个更深层次的问题,即如何测试随机数生成器:

您提供的函数实际上不是一个随机数生成器,因为它的整个实现依赖于提供的随机数生成器。换句话说,您相信Python为您提供了一个合理的随机生成器。在大多数情况下,这是一件好事。如果您正在编写加密原语,您可能需要做一些其他的事情,此时您需要一些真正健壮的测试策略(但它们永远都不够)

测试一个函数返回一个特定的数字序列实际上并不能告诉您函数在“生成随机数”方面的正确性。预定义的数字序列与随机序列相反

那么,你到底想测试什么?对于“滚动”功能,我认为您需要测试:

  • 给定“足够”的卷,它产生1到6之间的所有数字,最好是“近似”相等的比例
  • 它不生产任何其他东西
  • 1的问题。你的函数被定义为一个随机序列,所以你为定义“足够”或“近似相等”而设置的任何硬限制偶尔会失败的几率总是非零的。您可以进行一些计算来选择一些限制,以确保您的测试不太可能失败超过10亿次,例如1次,或者您可以执行一个
    random.seed()
    调用,这意味着如果它通过一次,它将永远不会失败(除非Python的底层实现发生更改)

    项目2。可以更容易地进行“测试”-生成大量“N”项,检查所有项目是否在预期结果范围内

    然而,对于所有这些,我会问单元测试的实际价值是什么。实际上,你不能编写一个测试来检查某个东西是否是“随机的”。要查看函数是否具有合理的随机性来源并正确使用它,测试是无用的——您必须检查代码。一旦您完成了这项工作,很明显您的函数是正确的(提供Python提供了一个像样的随机数生成器)


    简而言之,这是单元测试提供极少价值的情况之一。我可能只写一个测试(上面的第2项),然后就不写了。

    可能想看看@JaredGoguen谢谢,我看过了,但不能完全理解他们的建议。似乎“seq=random.randint”是我的问题,我不知道函数调用会使用测试中指定的种子。谢谢!似乎我不太明白函数调用会自动使用测试中的种子,并且我可以手动检查来自该种子的值。