如何计算N大小的是/否测试的所有可能结果?

时间:2012-11-19 16:14:18

标签: c# math

我正在尝试用70个问题来计算测试的可能结果。他们都是bo ..如何做到这一点以及必须完成多少计算。

5 个答案:

答案 0 :(得分:2)

好吧,如果你需要运行70个真/假值的每个组合,那就是大约2 ^ 70 = 1.18e21 = 1.18性别组合。如果你可以在每个时钟周期完成一个,那么3 GHz的4核机器需要3000年才能计算出所有解决方案。如果你在0.1毫米厚的纸张上打印每个结果,每页50行,那叠纸就会超过一万亿英里(你可能会想到一英里高的纸叠超过1600万张纸的事实,重达72吨,可以生产1000多棵树。

我会重新考虑分析这个问题的方法。

答案 1 :(得分:0)

您可能希望在循环或递归中执行此操作。

必须完成 2 70 计算的顺序,考虑到可能的测试数量。

如果你不关心个别路径,或者只是 70

答案 2 :(得分:0)

如果你的意思是想要获得真实的bool数量,假设它们存储在数组中,则循环遍历它们。

int score = 0;
for(int c = 0; c < boolArray.Length; c++)
{
    if(boolArray[c])
    {
        score++;
    }
}
// (Now you have the score)

我不确定这个确切的代码是否有效,因为我对c#不太熟悉,但你应该明白这一点。

如果你的意思是你想要测试可以给你的所有可能性,它的2 ^ 70 (2因为bool只有两个值,70因为有70个bool)。

答案 3 :(得分:0)

嗯,每个结果都可以是真或假,所以共有2 ^ 70个结果。 (非常多!)

如果您真的想要枚举所有结果,可以执行以下操作:

IEnumerable<IEnumerable<bool>> EnumerateResults()
{
    var curr = new List<bool>();
    for (var idx = 0; idx < 3; idx++) curr.Add(false);
    while (!curr.All(v => v))
    {
        var idx = 0;
        // add one with carry
        while (curr[idx]) // no index OOB, because of while condition
        {
            curr[idx] = false;
            idx++;
        }
        curr[idx] = true;
        yield return new List<bool>(curr); // clone
    }
}

答案 4 :(得分:0)

答案很简单。你正在处理一个N大小的二进制数。例如,4个问题测试,有16种可能性

0000 0001 0010 0011

0100 0101 0110 0111

1000 1001 1010 1011

1100 1101 1110 1111

对于N,它只是2 ^ N