C# 为什么我会得到重复的随机数?

C# 为什么我会得到重复的随机数?,c#,C#,我想显示许多任务的随机隆隆声,但结果是我得到了重复的数字 for (int i = 0; i < 500; i++) { Task.Factory.StartNew(() => { string a = new Random().Next(0, 999999).ToString(); richTextBox1.Invoke(new Action(() => { richTextBox1.Ap

我想显示许多任务的随机隆隆声,但结果是我得到了重复的数字

for (int i = 0; i < 500; i++)
{
    Task.Factory.StartNew(() =>
    {
        string a = new Random().Next(0, 999999).ToString();
        richTextBox1.Invoke(new Action(() =>
        {
            richTextBox1.AppendText(a + "\n");
        }));
    });
}
for(int i=0;i<500;i++)
{
Task.Factory.StartNew(()=>
{
字符串a=new Random().Next(0,999999).ToString();
richTextBox1.Invoke(新操作(()=>
{
richTextBox1.AppendText(a+“\n”);
}));
});
}
691241 691241 691241 691241 691241 691241 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621 527621

我还有一个关于任务和线程的问题

类不是静态的很重要吗?例如,如果我想发送带有线程/任务的多个POST查询?

您需要在for循环之外声明随机实例

然后在内部重用该实例。 您可能还想“锁定”对random类的调用,这样两个调用就不会同时发生

        var synRoot = new object();
        var rand = new Random();
        for (int i = 0; i < 500; i++)
        {
            Task.Factory.StartNew(() =>
            {
                lock(syncRoot)
                {
                    //lock to avoid multiple threads calling at the same time.
                    string a = rand.Next(0, 999999).ToString();
                    richTextBox1.Invoke(new Action(() =>
                    {
                        richTextBox1.AppendText(a + "\n");
                    }));
                }

            });
        }   
var synRoot=新对象();
var rand=new Random();
对于(int i=0;i<500;i++)
{
Task.Factory.StartNew(()=>
{
锁定(同步根)
{
//锁定以避免多个线程同时调用。
字符串a=rand.Next(099999.ToString();
richTextBox1.Invoke(新操作(()=>
{
richTextBox1.AppendText(a+“\n”);
}));
}
});
}   
原因是,随机类使用内部时钟的分辨率来种子本身。。。这意味着,如果两个或多个任务在该解析窗口内创建一个新实例,则两个实例将具有相同的种子


为了避免这种情况,您需要重用单个实例

new Random()
使用默认种子实际时间创建随机对象。如果在短时间内创建两个随机数,它们将具有相同的种子。因此,创建一个随机对象并在for循环中使用它。

阅读文档:Random()构造函数使用默认种子值。这是实例化随机数生成器最常用的方法。在.NET Framework中,默认种子值与时间相关。在.NETCore中,默认种子值由线程静态伪随机数生成器生成。好的,这很好。例如,如果我创建一个自己的类(非静态),该类向服务器发送Post请求,那么我是否也应该在循环之外创建实例呢?@schokoBong取决于“随机性”的范围,如果您希望它在所有请求中都是随机的。。。。或者可能只是用户会话。。。或者其他一些标准。但重点是你必须决定随机性的范围。@schokoBong你可能还想添加一个lock语句来避免其他问题。如果你认为这回答了你的问题,请标记为已回答。太好了。我需要更多地查找lock/Threads/Task:D