首页 > 解决方案 > 为什么我得到重复的随机数?

问题描述

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

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");
        }));
    });
}

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 查询?

标签: c#

解决方案


您需要在 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");
                    }));
                }

            });
        }   

原因是 Random 类使用内部时钟的分辨率为自身播种......所以这意味着如果 2 个或更多任务在该分辨率窗口内创建一个新实例,则两个实例将具有相同的 SEED。

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


推荐阅读