簡體   English   中英

Scalacheck:生成總數小於某個值的數字列表

[英]Scalacheck: generate list of numbers with total less than a certain value

我需要使用 ScalaCheck 生成一個給定大小的隨機數字列表,其總數小於給定的固定閾值。 換句話說,請執行以下操作:

val threshold = 3000    
val listGenerator = Gen.listOfN(2000, Gen.choose(1,2000)) suchThat { _.sum < theshold }

雖然上面准確地表達了我想要實現的目標,但它不起作用,因為 suchThat 子句最終丟棄了絕大多數生成的值。

好吧,鑒於您的最大值是 3k,並且您想要一個 2000 的列表,最小值為 1,我希望列表主要是 1 和 2。 下面是一種解決方案(使用當前數字只會生成 1 的列表),

val threshold = 3000

val max = 2000
val max = threshold / n

val listGenerator = Gen.listOfN(max, Gen.choose(1,max))

如果您允許 0,數學會有所改變。

假設閾值為T ,列表的長度為N ,您可以通過在0 until T之間選取N + 1不同的排序隨機數來生成此列表,然后計算相鄰數字之間的差異。

例如,讓T = 10N = 3 ,首先生成 4 個不同的排序數:

1, 4, 6, 9

通過計算相鄰數字的差異,你得到:

3, 2, 3

其和為 8,小於 10。

在此之后,您可以擁有以下生成器:

  def gen(T: Int, N: Int): Gen[collection.Seq[Int]] =
    Gen.pick(N + 1, 0 until T).map(_.sortBy(-_)).map { sorted =>
      (sorted.init, sorted.tail).zipped.map(_ - _)
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM