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.
5 回答
好吧,如果您需要运行 70 个真/假值的每个组合,那大约是 2^70 = 1.18e21 = 1.18 六分之一的组合。如果每个时钟周期可以做一个,那么一台 3 GHz 的 4 核机器将需要 3000 年才能计算所有解决方案。如果您将每个结果打印在 0.1 毫米厚的纸上,每页 50 行,那么纸叠将超过一万亿英里高(您可能会想到一个事实,一英里高的纸叠有超过 1600 万张纸,重 72 吨,需要 1000 多棵树来制作)。
我会重新考虑分析这个问题的方法。
如果你的意思是你想得到真实的布尔值,假设它们存储在一个数组中,循环遍历它们。
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 个布尔值)。
嗯,每个结果都可以是真或假,所以总共有 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
}
}
答案很简单。您正在处理一个 N 大小的二进制数。例如,一个 4 个问题的测试,有 16 种可能性
0000 0001 0010 0011
0100 0101 0110 0111
1000 1001 1010 1011
1100 1101 1110 1111
对于 N,它只是 2^N
您可能希望循环或递归地执行此操作。
考虑到可能测试的数量,必须进行 2 70次计算。
或者,如果您不关心个别路径,则 可能只有70个。