Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Haskell快速检查唯一随机数生成_Haskell_Quickcheck - Fatal编程技术网

Haskell快速检查唯一随机数生成

Haskell快速检查唯一随机数生成,haskell,quickcheck,Haskell,Quickcheck,有人确切地知道如何使用QuickCheck在Haskell中定义生成器,以便只拾取一次所选元素吗 我已经意识到我可能需要一个“Gen(可能是正数)”生成器,但这当然会产生重复的数字。我想要它,这样选择的数字就不会重复。在返回一个数字的例子中,我只想返回一个,在随机数都用完的例子中,我不想返回任何东西 谢谢 标记你不能。看这张照片。到目前为止,它没有办法对所选内容进行任何说明。给定相同的随机生成器和大小限制,它必须始终生成相同的结果。但是,您可以编写一个Eq a=>Gen[a],生成一个不重复的值

有人确切地知道如何使用QuickCheck在Haskell中定义生成器,以便只拾取一次所选元素吗

我已经意识到我可能需要一个“Gen(可能是正数)”生成器,但这当然会产生重复的数字。我想要它,这样选择的数字就不会重复。在返回一个数字的例子中,我只想返回一个,在随机数都用完的例子中,我不想返回任何东西

谢谢

标记你不能。看这张照片。到目前为止,它没有办法对所选内容进行任何说明。给定相同的随机生成器和大小限制,它必须始终生成相同的结果。但是,您可以编写一个
Eq a=>Gen[a]
,生成一个不重复的值列表。一个简单(但有点幼稚)的应该是这样的

uniques :: Eq a => Gen a -> Gen [a]
uniques gen = fmap nub $ listOf gen

您可以为此使用
排列
(在模块
数据.列表中)

这是
置换的函数签名

排列::[a]->[[a]]

如您所见,它返回一个列表列表。下面是一个小示例(使用GHCi 7.0.4):

>置换[1..3]
[1,2,3],[2,1,3],[3,2,1],[2,3,1],[3,1,2],[1,3,2]

所以你可以这样做:

prop\u unique\u elements=forAll(元素(排列[1..3])$\x->foo==bar


我还没有测试过,所以它需要一些按摩,但我希望它能清楚地表达这一点。祝你好运。

快速检查通常用于随机测试,而不是穷举测试。有几个很棒的库可以处理详尽的测试——看看和。

xorshift随机生成器在设计上没有重复。你可以试试。(上面的陈述适用于前2^64个左右的数字。Hrm。我想每次使用共轨道可能会选择不同的生成器(不知为什么?)在范围受限/约束的情况下,我不认为它会做你认为它会做的事情。@sclv我认为它会做什么?我一直认为它是在为谓词上的生成器声明通用量化。:)它显然不会彻底地运行每个置换一次,但是生成器的每个结果都会是一个包含唯一元素的列表,正如问题所要求的那样。然后我们对问题有不同的解读——我把它理解为要求进行详尽的测试——即为每个测试选择一个不同的元素,而不是要求生成器为每个测试生成不同元素的列表,但可能会在不同的测试中产生相同的列表。