如何生成从集合中挑选的 n 个唯一元素的列表?
How can I generate a list of n unique elements picked from a set?
如何使用 ScalaCheck 从一组值(不是生成器)生成 n unique 值 (Gen[List[T]]
) 的列表? This post 使用 Gen[T]*
而不是一组值,我似乎无法重写它以使其工作。
编辑
应@Jubobs 的要求,我现在可耻地展示了我到目前为止所做的尝试,揭示了我在使用 ScalaCheck 时的完全新手状态:-)
我只是尝试将 gs: Gen[T]
重复参数替换为 Set
在@Eric 写的解决方案中 here:
def permute[T](n: Int, gs: Set[T]): Gen[Seq[T]] = {
val perm = Random.shuffle(gs.toList)
for {
is <- Gen.pick(n, 1 until gs.size)
xs <- Gen.sequence[List[T], T](is.toList.map(perm(_)))
} yield xs
}
但是 is.toList.map(perm(_))
有红色下划线,IntelliJ IDEA 告诉我 "You should read ScalaCheck API first before blind (although intuitive) trial and error",或者 "Type mismatch, expected: Traversable[Gen[T]], actual List[T]" ,记不清了。
我还尝试了其他几种方法,事后看来,我发现其中大部分方法很荒谬(因此不值得发布),最天真的方法是按原样使用@Eric 的(否则有用且整洁)解决方案:
val g = for (i1 <- Gen.choose(0, myList1.length - 1);
i2 <- Gen.choose(0, myList2.length - 1))
yield new MyObject(myList1(i1), myList2(i2))
val pleaseNoDuplicatesPlease = permute(4, g, g, g, g, g)
经过一些测试后,我发现 pleaseNoDuplicatesPlease
实际上包含重复项,此时我权衡了是否必须通读 ScalaCheck API 并比现在了解更多(这将不可避免地逐渐出现),或者在 Whosebug 上发布我的问题(在仔细搜索是否存在类似问题之后)。
Gen.pick
正合您意:
scala> import org.scalacheck.Gen
import org.scalacheck.Gen
scala> val set = Set(1,2,3,4,5,6)
set: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4)
scala> val myGen = Gen.pick(5, set).map { _.toList }
myGen: org.scalacheck.Gen[scala.collection.immutable.List[Int]] = org.scalacheck.Gen$$anon@78693eee
scala> myGen.sample
res0: Option[scala.collection.immutable.List[Int]] = Some(List(5, 6, 2, 3, 4))
scala> myGen.sample
res1: Option[scala.collection.immutable.List[Int] = Some(List(1, 6, 2, 3, 4))
如何使用 ScalaCheck 从一组值(不是生成器)生成 n unique 值 (Gen[List[T]]
) 的列表? This post 使用 Gen[T]*
而不是一组值,我似乎无法重写它以使其工作。
编辑
应@Jubobs 的要求,我现在可耻地展示了我到目前为止所做的尝试,揭示了我在使用 ScalaCheck 时的完全新手状态:-)
我只是尝试将 gs: Gen[T]
重复参数替换为 Set
在@Eric 写的解决方案中 here:
def permute[T](n: Int, gs: Set[T]): Gen[Seq[T]] = {
val perm = Random.shuffle(gs.toList)
for {
is <- Gen.pick(n, 1 until gs.size)
xs <- Gen.sequence[List[T], T](is.toList.map(perm(_)))
} yield xs
}
但是 is.toList.map(perm(_))
有红色下划线,IntelliJ IDEA 告诉我 "You should read ScalaCheck API first before blind (although intuitive) trial and error",或者 "Type mismatch, expected: Traversable[Gen[T]], actual List[T]" ,记不清了。
我还尝试了其他几种方法,事后看来,我发现其中大部分方法很荒谬(因此不值得发布),最天真的方法是按原样使用@Eric 的(否则有用且整洁)解决方案:
val g = for (i1 <- Gen.choose(0, myList1.length - 1);
i2 <- Gen.choose(0, myList2.length - 1))
yield new MyObject(myList1(i1), myList2(i2))
val pleaseNoDuplicatesPlease = permute(4, g, g, g, g, g)
经过一些测试后,我发现 pleaseNoDuplicatesPlease
实际上包含重复项,此时我权衡了是否必须通读 ScalaCheck API 并比现在了解更多(这将不可避免地逐渐出现),或者在 Whosebug 上发布我的问题(在仔细搜索是否存在类似问题之后)。
Gen.pick
正合您意:
scala> import org.scalacheck.Gen
import org.scalacheck.Gen
scala> val set = Set(1,2,3,4,5,6)
set: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4)
scala> val myGen = Gen.pick(5, set).map { _.toList }
myGen: org.scalacheck.Gen[scala.collection.immutable.List[Int]] = org.scalacheck.Gen$$anon@78693eee
scala> myGen.sample
res0: Option[scala.collection.immutable.List[Int]] = Some(List(5, 6, 2, 3, 4))
scala> myGen.sample
res1: Option[scala.collection.immutable.List[Int] = Some(List(1, 6, 2, 3, 4))