C#中的任务-使用随机

C#中的任务-使用随机,c#,asynchronous,parallel-processing,task-parallel-library,C#,Asynchronous,Parallel Processing,Task Parallel Library,我正在学习C#中的异步编程,并编写了以下代码来测试任务并行库(控制台应用程序): 如果是慢速操作: public class SlowOperation { public void PerformSlowOperation(int id) { var rand = new Random(); double sum = 0; for (int i = 0; i < 100000000; i++) {

我正在学习C#中的异步编程,并编写了以下代码来测试任务并行库(控制台应用程序):

如果是慢速操作:

public class SlowOperation
{
    public void PerformSlowOperation(int id)
    {
        var rand = new Random();
        double sum = 0;

        for (int i = 0; i < 100000000; i++)
        {
            var number = Convert.ToDouble(rand.Next(100)) / 100;
            sum += number;
        }
        Console.WriteLine("Finished processing operation no. {0}. Final sum calculated is: {1}", id, sum.ToString("0.##"));
    }
}
公共类慢操作
{
public void PerformSlowOperation(int-id)
{
var rand=new Random();
双和=0;
对于(int i=0;i<100000000;i++)
{
变量编号=Convert.ToDouble(rand.Next(100))/100;
总和+=数字;
}
Console.WriteLine(“已完成处理操作编号{0}。计算的最终总和为:{1}”,id,sum.ToString(“0.##”);
}
}

有谁能帮助我理解为什么SlowOperation类的每个实例产生的和是完全相同的?

随机的
是以低分辨率基于时间的种子。这是一个经典问题,在我看来,这是一个API设计错误。我认为CORECRL回购协议已经改变了这一点

new Random().Next()==new Random().Next()
几乎总是正确的


还要注意,问题中95%的代码与问题无关。将来,您可以自己简化代码,直到只剩下随机调用。这允许您自己发现此类问题。

在每个任务中设置不同的种子值。例如:

var rand = new Random(new System.DateTime().Millisecond + id);
随机构造器:

如果应用程序需要不同的随机数序列,请调用 此构造函数重复使用不同的种子值。一种方法 生成唯一的种子值是为了使其具有时间依赖性。例如, 从系统时钟推导种子值。但是,系统时钟 可能没有足够的分辨率来提供不同的调用 具有不同种子值的此构造函数的


为什么您要启动一系列任务,然后立即禁用秒表并说它们已经完成,而不真正等待它们完成?调用
new Random(new System.DateTime().millished)
与调用
new Random()
没有什么不同。底层仍然基于毫秒。你说得对。我给出了一个不幸的例子,我将编辑我的答案并删除这个例子。
var rand = new Random(new System.DateTime().Millisecond + id);