代码之家  ›  专栏  ›  技术社区  ›  Manuel Araoz

如何生成满足某些限制的整数?

  •  2
  • Manuel Araoz  · 技术社区  · 15 年前

    任何人都能为我提供生成满足某些限制的整数的技术吗?

    例如,假设我需要生成整数x和y,这样

          100 > x
    and   y < x + 5
    

    我不是指这个特殊的例子,而是一些生成满足特定条件的整数的通用技术。

    6 回复  |  直到 9 年前
        1
  •  6
  •   Joey Gumbo    15 年前

    嗯,这并不难:

    1. 选择一个整数,可以随机选择。
    2. 检查你的情况
    3. 如果有一个条件失败,请返回步骤1。

    如果有多个整数,例如 X Y 在您的示例中,将“整数”替换为“整数”。

    这种技术也被称为 拒绝抽样 .

    例如,您可以使用一系列链接迭代器来实现这一点。有些约束和生成器一样工作得很好,比如“小于100的正整数”,所以在过滤所有其他约束之前,您可能先从其中一个约束开始。

    我看到的另一个适用于一般限制的选项是分析约束并生成数字而不进行猜测,但知道如何生成它们。这对于诸如__0<x<100_等约束来说是微不足道的,但除此之外,它与实现计算机代数系统密切相关。还要记住,你必须同时满足每一个约束…要花很长时间进行拒绝抽样,将使这种方法成为实现的一个噩梦。

        2
  •  4
  •   Maurits Rijk    15 年前

    如果所有约束都可以写成一组线性方程,则可以使用 linear programming 找到最大化“c1*x+c2*y”的解决方案。对于c1和c2,可以绘制随机值。尤其是如果有很多约束和变量,它们可能比尝试x和y的随机值更快。

        3
  •  1
  •   yosser    15 年前

    如果它是一种脚本语言,您可以将最小和最大的x和y值以及一系列测试传递给一个函数,然后使用rand在您的范围内生成初始值。

    接下来,您只需使用“eval”的某个变量迭代数组,以测试您的值是否合适。

    这将是解决您问题的通用解决方案。

        4
  •  1
  •   Alex Feinman    15 年前

    您希望了解基于约束的语言。例如, CLIP 将允许您指定约束,然后返回满足所有约束的间隔集。

        5
  •  1
  •   Justin Smith    15 年前

    这种问题是什么 Prolog 是为设计的。你也可以研究新的语言,比如 Mozart 更具现代感。声明性编程模型是为输出声明约束,然后获得满足指定约束的答案。

    引用维基百科的序言页面:

    Prolog的根源在于形式逻辑,与许多其他编程语言不同,Prolog是声明性的:程序逻辑用关系表示,用事实和规则表示。通过对这些关系运行查询来触发执行。
        6
  •  0
  •   tooleb    15 年前

    如果您感觉到LINQ-Y,那么可以从所有可能的X、Y对的列表开始,然后为每个条件应用一个WHERE子句。 不管剩下什么,你都可以从中随机挑选。

    Dim everything As List(Of Point) = generate_pairs()
    Dim rest As List(Of Point) = everything.Where(Function(pp) pp.X > 100).ToList
    rest = rest.Where(Function(pp) pp.Y < pp.X + 5).ToList
    Dim rnd As New Random()
    Dim r As Integer = rnd.Next(rest.Count)
    Dim p As Point = rest.Skip(r).Take(1).SingleOrDefault
    System.Console.WriteLine("x: " & p.X & " y: " & p.Y)