如何定义生成序列元素子集的 ScalaCheck 生成器?
How can I define a ScalaCheck generator that produces a subset of a sequence's elements?
如何选择序列元素的子集?
例如,如果我有序列 Seq(1,2,3,4,5)
,我希望每次调用我的生成器时都生成类似
的内容
Seq(1,4)
或
Seq(1,2,3,5)
或
Seq()
如何定义这样的生成器?
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@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()
这取决于每个元素出现在结果中的概率。例如,对于以 50% 的几率出现的任何元素,您可以使用以下内容。希望这有帮助。
import scala.util.Random
val s = Seq(1,2,3,4,5)
s filter { i => Random.nextInt(2) == 1 }
如何选择序列元素的子集?
例如,如果我有序列 Seq(1,2,3,4,5)
,我希望每次调用我的生成器时都生成类似
Seq(1,4)
或
Seq(1,2,3,5)
或
Seq()
如何定义这样的生成器?
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@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()
这取决于每个元素出现在结果中的概率。例如,对于以 50% 的几率出现的任何元素,您可以使用以下内容。希望这有帮助。
import scala.util.Random
val s = Seq(1,2,3,4,5)
s filter { i => Random.nextInt(2) == 1 }