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