gpt4 book ai didi

scala - 使用 scalacheck 生成排列

转载 作者:行者123 更新时间:2023-11-30 23:52:52 31 4
gpt4 key购买 nike

我有一些这样的生成器:

val fooRepr = oneOf(a, b, c, d, e)
val foo = for (s <- choose(1, 5); c <- listOfN(s, fooRepr)) yield c.mkString("$")

这会导致重复......我可能会得到两个 a 等。我真正想要的是生成恰好为 0 或 1 或 a、b、c、d 或 e(至少有一个)的随机排列,以任何顺序。

我在想一定有一个简单的方法,但我什至很难找到一个困难的方法。 :)

编辑:好的,这似乎有效:
val foo = for (s <- choose(1, 5);
c <- permute(s, a, b, c, d, e)) yield c.mkString("$")

def permute[T](n: Int, gs: Gen[T]*): Gen[Seq[T]] = {
val perm = Random.shuffle(gs.toList)
for {
is <- pick(n, 1 until gs.size)
xs <- sequence[List,T](is.toList.map(perm(_)))
} yield xs
}

...从 Gen.pick大量借款.

感谢您的帮助,-埃里克

最佳答案

Rex,感谢您准确地阐明我正在尝试做什么,这是有用的代码,但对于 scalacheck 可能不太好,尤其是在所讨论的生成器非常复杂的情况下。在我的特殊情况下,生成器 a、b、c 等正在生成巨大的字符串。

无论如何,我上面的解决方案中有一个错误;对我有用的是下面。我在 github 放了一个小项目来演示如何做到这一点。

它的胆量在下面。如果有更好的方法,我很想知道......

package powerset

import org.scalacheck._
import org.scalacheck.Gen._
import org.scalacheck.Gen
import scala.util.Random

object PowersetPermutations extends Properties("PowersetPermutations") {

def a: Gen[String] = value("a")

def b: Gen[String] = value("b")

def c: Gen[String] = value("c")

def d: Gen[String] = value("d")

def e: Gen[String] = value("e")

val foo = for (s <- choose(1, 5);
c <- permute(s, a, b, c, d, e)) yield c.mkString

def permute[T](n: Int, gs: Gen[T]*): Gen[Seq[T]] = {
val perm = Random.shuffle(gs.toList)
for {
is <- pick(n, 0 until gs.size)
xs <- sequence[List, T](is.toList.map(perm(_)))
} yield xs
}

implicit def arbString: Arbitrary[String] = Arbitrary(foo)

property("powerset") = Prop.forAll {
a: String => println(a); true
}
}

谢谢,
埃里克

关于scala - 使用 scalacheck 生成排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5107281/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com