私はこのようないくつかのジェネレータを持っています:
val fooRepr = oneOf(a, b, c, d, e)
val foo = for (s <- choose(1, 5); c <- listOfN(s, fooRepr)) yield c.mkString("$")
これは重複につながります... 2 つの a などを取得する可能性があります。本当に必要なのは、正確に 0 または 1、または a、b、c、d、または e のそれぞれ (少なくとも 1 つの何か) を使用してランダム順列を生成することです。 、任意の順序で。
簡単な方法があるに違いないと思っていましたが、難しい方法を見つけるのに苦労しています。:)
編集:わかりました、これはうまくいくようです:
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
ます。
助けてくれてありがとう、-エリック