2016-08-12 6 views
2

Wie kann ich eine Teilmenge der Elemente einer Sequenz auswählen?Wie kann ich einen ScalaCheck-Generator definieren, der eine Teilmenge der Elemente einer Sequenz erzeugt?

Zum Beispiel, wenn ich die Sequenz Seq(1,2,3,4,5) hätte, würde ich jeden Anruf zu meinem Generator mag so etwas wie

Seq(1,4) 

oder

Seq(1,2,3,5) 

oder

Seq() 

zu produzieren Wie kann ich einen solchen Generator definieren?

+0

Hat die 'Seq', aus der Sie auswählen, einzigartige Elemente? – Jubobs

+0

Ja das ist, was ich im Sinn hatte –

+0

Ja, es ist keine strikte (richtige) Teilmenge –

Antwort

4

org.scalacheck.Gen.someOf ist ein Generator, der eine Zufallszahl von Elementen aus einer iterable nimmt:

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

Dies hängt von der Wahrscheinlichkeit für jedes Element in der Folge zu zeigen. Wenn beispielsweise ein Element mit 50% Wahrscheinlichkeit angezeigt wird, können Sie Folgendes verwenden. Hoffe das hilft.

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

Dies ist im Kontext von ScalaCheck, also OP ist auf der Suche nach Rückgabetyp wie 'Gen [Seq [Int]]'. – Brian

+0

ah, OK. Vielen Dank. – ryan

Verwandte Themen