2016-08-12 34 views
2

如何挑選序列元素的子集?如何定義生成序列元素子集的ScalaCheck生成器?

舉例來說,如果我有序列Seq(1,2,3,4,5),我想每次調用我的發電機來產生類似

Seq(1,4) 

Seq(1,2,3,5) 

Seq() 

我怎樣才能定義這樣一個發電機?

+0

您選擇的'Seq'是否有獨特的元素? – Jubobs

+0

是的,這是我的想法 –

+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]] = [email protected] 

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() 
0

這取決於概率爲每個元素在你的結果顯示出來。例如,對於出現50%概率的元素,您可以使用以下內容。希望這可以幫助。

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

這是在ScalaCheck的上下文中,所以OP正在尋找類似Gen [Seq [Int]]的返回類型。 – Brian

+0

啊,好的。謝謝。 – ryan