我強制性地將所有素數低於2000000的加起來。之後,爲了好玩,我試着平行我,但當我看到Parallel.For
給我一個時,我有點驚訝不正確總和!.Net並行。對於奇怪的行爲
這裏是我的代碼(C#)
static class Problem
{
public static long Solution()
{
long sum = 0;
//Correct result is 142913828922
//Parallel.For(2, 2000000, i =>
// {
// if (IsPrime(i)) sum += i;
// });
for (int i = 2; i < 2000000; i++)
{
if (IsPrime(i)) sum += i;
}
return sum;
}
private static bool IsPrime(int value)
{
for (int i = 2; i <= (int)Math.Sqrt(value); i++)
{
if (value % i == 0) return false;
}
return true;
}
}
我知道暴力是很糟糕的解決方案在這裏,但不是一個疑問的。我認爲我犯了一些非常愚蠢的錯誤,但我找不到它。所以,for
正在計算正確,但Parallel.For
不正確。
可能重複的[Parallel.For():更新循環外的變量](http://stackoverflow.com/questions/2774170/parallel-for-update-variable-outside-of-loop) – 2010-07-31 12:14:11
和確切的重複[與Parallel.ForEach不同的求和結果](http://stackoverflow.com/questions/3367293/different-summation-results-with-parallel-foreach/3367311#3367311) – 2010-07-31 13:34:20