ScalaCheck 生成不同的值列表
ScalaCheck generate a distinct list of values
我是 ScalaCheck 的新手,我想以某种方式生成不同值的列表(即一组)。使用我的方法,值不是唯一的。
val valueList: Gen[List[Int]] = Gen.ListOf(Arbitrary.arbitrary[Int])
创建具有独特 values/a 集的列表的可能方法有哪些?也许使用 suchThat
或 distinct
?
粗糙但有效:
Gen.listOf(Arbitrary.arbitrary[Int]).map(_.toSet)
如果你想要一套特定尺寸的套装,你可以这样做
def setOfN[A](n: Int, gen: Gen[A]): Gen[Set[A]] =
Gen.listOfN(n, gen).flatMap { lst =>
val set = lst.toSet
if (set.size == n) Gen.const(set)
else if (set.size > n) Gen.const(set.take(n))
else setOfN(n - set.size, gen.retryUntil(x => !set(x))).flatMap(_ ++ set)
}
(值得注意的是,retryUntil 可能很脆弱,尤其是当 n 相对于通常生成的值的数量增长时(例如,对于 Int
Scalacheck 生成 0、+/- 1 等相当频繁))
当然,因为 Set
有一个 org.scalacheck.util.Buildable
实例
Gen.containerOf[Set, Int](Arbitrary.arbitrary[Int])
我是 ScalaCheck 的新手,我想以某种方式生成不同值的列表(即一组)。使用我的方法,值不是唯一的。
val valueList: Gen[List[Int]] = Gen.ListOf(Arbitrary.arbitrary[Int])
创建具有独特 values/a 集的列表的可能方法有哪些?也许使用 suchThat
或 distinct
?
粗糙但有效:
Gen.listOf(Arbitrary.arbitrary[Int]).map(_.toSet)
如果你想要一套特定尺寸的套装,你可以这样做
def setOfN[A](n: Int, gen: Gen[A]): Gen[Set[A]] =
Gen.listOfN(n, gen).flatMap { lst =>
val set = lst.toSet
if (set.size == n) Gen.const(set)
else if (set.size > n) Gen.const(set.take(n))
else setOfN(n - set.size, gen.retryUntil(x => !set(x))).flatMap(_ ++ set)
}
(值得注意的是,retryUntil 可能很脆弱,尤其是当 n 相对于通常生成的值的数量增长时(例如,对于 Int
Scalacheck 生成 0、+/- 1 等相当频繁))
当然,因为 Set
org.scalacheck.util.Buildable
实例
Gen.containerOf[Set, Int](Arbitrary.arbitrary[Int])