如何定义生成序列元素子集的ScalaCheck生成器?

时间:2016-08-12 16:15:06

标签: scala scalacheck

如何选择序列元素的子集?

例如,如果我有序列Seq(1,2,3,4,5),我希望每次调用我的生成器来生成类似

的内容
Seq(1,4)

Seq(1,2,3,5)

Seq()

如何定义这样的生成器?

2 个答案:

答案 0 :(得分:4)

org.scalacheck.Gen.someOf是一个从迭代中选择随机数量元素的生成器:

scala> import org.scalacheck.Gen
import org.scalacheck.Gen

scala> val baseSeq = Seq(1, 2, 3, 4, 5)
baseSeq: Seq[Int] = List(1, 2, 3, 4, 5)

scala> val myGen = Gen.someOf(baseSeq).map(_.toSeq)
myGen: org.scalacheck.Gen[Seq[Int]] = org.scalacheck.Gen$$anon$6@ff6a218

scala> myGen.sample.head
res0: Seq[Int] = List(3, 4, 5)

scala> myGen.sample.head
res1: Seq[Int] = List(1, 2, 3, 4)

scala> myGen.sample.head
res2: Seq[Int] = List()

答案 1 :(得分:0)

这取决于每个元素在结果中显示的概率。例如,对于任何显示50%几率的元素,您可以使用以下内容。希望这会有所帮助。

import scala.util.Random
val s = Seq(1,2,3,4,5)
s filter { i => Random.nextInt(2) == 1 }