确定性地组合发电机

时间:2017-10-11 15:11:41

标签: javascript generator

我有一个javascript项目,我需要能够创建确定性生成器(我称之为Arbitrary s)。例如,我可以使用以下代码创建任意用户名:

const name = arb.oneOf('Foo', 'Bar', 'Baz');

这导致生成器依次产生3个值,然后退出。但是,我还有一个函数,它可以从多个任意实例中创建元组,如下所示:

const namePairs = arb.tuple(name, name);

这会吐出['Foo', 'Foo']['Foo', 'Bar']等内容。它仍然会确定性地执行此操作,因此每当我遍历namePairs生成器时,我总会得到相同的价值观。但是,我为实现这一目标而编写的算法并不是很好。它有一些不好的功能,因此它不会生成所有可能的组合,并且在某些情况下它可以两次发出相同的值。这不是一个太大的问题,但我想改进它,但我无法弄清楚如何做到这一点。

基本上,我需要的是一个函数,它采用可变数量的生成器(可以)具有不同的长度并返回具有以下属性的单个生成器:

  1. 这是确定性的。如果我创建多个相同的任意实例,则从同一个" child"任意实例,我应该总是得到相同的项目。
  2. 它均匀地分配从子生成器获取的项目数。这很重要,因为发电机可以产生的总物品数量通常比我实际要求的物品数量大。因此,重要的是,如果我做arb.tuple(allPositiveNumbers, allPositiveNumbers)我不会将1作为第一个参数,而将数字增加为第二个参数(或者反过来)。< / LI>
  3. 如果可能的话,我希望能够详尽地生成输入生成器的所有可能组合,而不会产生重复。这不是一个要求,而是一个愿望。
  4. 任何关于如何制作这样的东西的提示都会非常感激。

0 个答案:

没有答案