我有一个任务是使用PLINQ并行化迭代.为此,我有一个基于for-cycle的功能:
public void PointGenerator(int n, Random rnd)
{
for (int i = 1; i <= n; i++)
{
x = rnd.NextDouble();
y = rnd.NextDouble(); //
if (((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5)) < 0.25)
{
N_0++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能用PLINQ呢?
你可以尝试这样:
public bool Check(double x, double y)
{
return ((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5)) < 0.25;
}
// ...
N_0 = Enumerable
.Range(0, n)
.Select(i => new { X = rnd.NextDouble(), Y = rnd.NextDouble() })
.AsParallel()
.Count(p => Check(p.X, p.Y));
Run Code Online (Sandbox Code Playgroud)
正如Roman Dvoskin在其他答案的评论中指出的那样,Random对象不是线程安全的:
但是,Random对象不是线程安全的.如果您的应用程序从多个线程调用随机方法,则必须使用同步对象以确保一次只有一个线程可以访问随机数生成器.如果不确保以线程安全的方式访问Random对象,则对返回随机数的方法的调用将返回0.
可以通过首先生成所有XY对来解决此问题.