加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

ScalaCheck:选择具有自定义概率分布的整数

发布时间:2020-12-16 18:52:55 所属栏目:安全 来源:网络整理
导读:我想在 ScalaCheck中创建一个生成器,生成介于1和100之间的数字,但是对于接近1的数字具有钟形偏向. Gen.choose()在最小值和最大值之间随机分配数字: scala (1 to 10).flatMap(_ = Gen.choose(1,100).sample).toList.sortedres14: List[Int] = List(7,21,30,4
我想在 ScalaCheck中创建一个生成器,生成介于1和100之间的数字,但是对于接近1的数字具有钟形偏向.

Gen.choose()在最小值和最大值之间随机分配数字:

scala> (1 to 10).flatMap(_ => Gen.choose(1,100).sample).toList.sorted
res14: List[Int] = List(7,21,30,46,52,64,66,68,86,86)

Gen.chooseNum()对上限和下限有一个额外的偏见:

scala> (1 to 10).flatMap(_ => Gen.chooseNum(1,100).sample).toList.sorted
res15: List[Int] = List(1,1,61,85,91,92,100,100)

我想要一个choose()函数,它会给我一个看起来像这样的结果:

scala> (1 to 10).flatMap(_ => choose(1,2,5,11,18,35,49,100)

我看到choose()和chooseNum()采用隐含的Choose特征作为参数.我应该用吗?

解决方法

你可以使用Gen.frequency() (1):

val frequencies = List(
   (50000,Gen.choose(0,9)),(38209,Gen.choose(10,19)),(27425,Gen.choose(20,29)),(18406,Gen.choose(30,39)),(11507,Gen.choose(40,49)),( 6681,Gen.choose(50,59)),( 3593,Gen.choose(60,69)),( 1786,Gen.choose(70,79)),(  820,Gen.choose(80,89)),(  347,Gen.choose(90,100))
 )

 (1 to 10).flatMap(_ => Gen.frequency(frequencies:_*).sample).toList
 res209: List[Int] = List(27,31,9,29,69,29)

我得到了https://en.wikipedia.org/wiki/Standard_normal_table#Complementary_cumulative的频率.代码只是表格的一个示例(%3或mod 3),但我认为你可以得到这个想法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读