-3

I'm trying to calculate the possible results of a test with 70 questions. They're all bools. How to do that and how many calculations they have to be done.

4

5 回答 5

2

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

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

于 2012-11-19T16:19:59.033 回答
0

如果你的意思是你想得到真实的布尔值,假设它们存储在一个数组中,循环遍历它们。

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

我不确定这个确切的代码是否会起作用,因为我对 c# 不是很熟悉,但你应该明白这一点。

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

于 2012-11-19T16:19:10.077 回答
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
    }
}
于 2012-11-19T16:20:59.737 回答
0

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

0000 0001 0010 0011

0100 0101 0110 0111

1000 1001 1010 1011

1100 1101 1110 1111

对于 N,它只是 2^N

于 2012-11-19T16:22:43.143 回答
0

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

考虑到可能测试的数量,必须进行 2 70次计算。

或者,如果您不关心个别路径,则 可能只有70个。

于 2012-11-19T16:17:43.170 回答