布尔变量的所有可能组合

时间:2012-09-19 05:04:57

标签: c# algorithm boolean

我正在尝试找到一种允许我执行以下操作的算法: 想象一下,我有10个布尔变量,我想尝试每一个组合,因为我的目标是找到任何组合,这将给我的一个方法的结果是真的(这个方法有很多限制,这就是为什么我要测试每种可能的组合,如果没有可以解决问题的组合,那么我想通知用户这个)。 我希望这是可以理解的!

4 个答案:

答案 0 :(得分:7)

试试这个:

for (int i = 0; i < (1 << 10); i++)
{
    bool b1 = (i & (1 << 0)) != 0;
    bool b2 = (i & (1 << 1)) != 0;
    bool b3 = (i & (1 << 2)) != 0;
    bool b4 = (i & (1 << 3)) != 0;
    ...

    if (MyMethod(b1, b2, b3, b4, ...))
    {
        // Found a combination for which MyMethod returns true
    }
}

当然,您也可以使用LINQ:

var result = from b1 in new[] { false, true }
             from b2 in new[] { false, true }
             from b3 in new[] { false, true }
             from b4 in new[] { false, true }
             ...
             where MyMethod(b1, b2, b3, b4, ...)
             select new { b1, b2, b3, b4, ... };

答案 1 :(得分:1)

我终于提出了一种更有效的方法:使用二进制数: 假设我想测试8个变量中所有可能的布尔组合: 如果我选择执行以下操作,我将测试每个组合:

public string CombinationFinder()
{
    for (int i = 0; i < 2 ^ 8; i++)
    {
        String ans = Convert.ToInt32(i, 2).ToString();
        if (myMethod(ans))
        {
            return ans;
        }
    }
    return null;
}

这将从0到255,二进制表示从00000000到11111111 其中每个数字取值0或1,可以表示为布尔值。在此示例中,如果找不到任何组合,则该方法将返回null。

答案 2 :(得分:0)

定义一个这样的类:

class Bint
{
  int num;
  public bool this[int num]
  {
    get {return num << n & 0x1 == 1;}
  }
  public int Num
  {
    get {return num;}
    set {num = value;}
  }
}

并遍历数字:

Bint n = new Bint();
for (int i = 0; i < Math.pow(2,10); i++)
{
 n.Num = i;
 f(n[0],n[1]...);
}

答案 3 :(得分:0)

我知道这是一个老问题,但是waclock的答案没有编译(C#中没有指数运算符)。 dtb的答案得到了99%的答案,但没有处理未知数量的布尔值,这就是答案所提供的:

var props = typeof(TypeWithBooleans).GetProperties().Where(prop => prop.PropertyType == typeof(bool)).ToArray();

for (var i = 0; i < (1 << props.Length); ++i)
{
    var combination = Enumerable.Range(0, props.Length).Select(j => (i & (1 << j)) != 0).ToArray();
    if (MyMethod(combination)) {
        // handle match
    };
}

这假设您关注的所有布尔值都限制在单个类/结构中,并且MyMethod使用了一个参数数组。