2016-08-12 4 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

ああ、OK。ありがとう。 – ryan

関連する問題