在Java中递归生成随机对象

时间:2012-08-18 09:43:13

标签: java random dynamically-generated solver

我可以使用什么库/方法为Java / Scala中的给定类深度生成随机对象? 通过深度生成,我的意思是递归地用随机值填充整个对象图,包括原始类型和复杂类型。

目标是使用随机生成的模拟对象进行测试。

为了使测试一致且可重复,每次运行时生成的对象集应该相同。

3 个答案:

答案 0 :(得分:3)

据我所知,有两种强大的方法可以随机生成非常大的任意类型的对象。第一种称为递归方法(由Wilflet和Nijenhuis引入,formalized由Flajolet,van Cutsem和Zimmerman引入),第二种称为 Boltzmann sampling 由Duchon,Flajolet,Louchard和Schaeffer。

在这两种方法中,你给出一个结构定义(一个“语法”),然后返回一个符合语法的大型随机对象。

两者都已成功用于程序的大规模测试(类似于Haskell的QuickCheck)。不幸的是,虽然这些方法有各种各样的实现,但我认为没有一个可以随时使用的Java库。例如,可以使用这些方法的Java实现检查Yann Ponty's page生物信息学。如果您使用OCaml,那么Alexis Darrasse和Benjamin Canou已经将a useful subset of Boltzmann sampling实现为代数类型(sumtypes)的完全自治库。

答案 1 :(得分:1)

InPUT库可以帮助您在Java中执行此操作。您可以在所谓的设计空间中以XML格式指定结构,该空间定义有效范围。在代码中,您只需调用

IDesignSpace ds = new DesignSpace("designSpace.xml");
TheType o = ds.next("TheTypeId");

现在,对象o根据您接受的XML中的有效值范围随机实例化。 Here您可以找到教程和示例。 this tutorial已解决了再现性问题。

答案 2 :(得分:0)

一些研究表明,Scala有一个很棒的框架叫做ScalaCheck,它的灵感来自于上面提到的Jérémie的QuickCheck。 虽然它是Scala的构建,但它也可以在Java中使用(虽然没有语法糖)