1

我有一个带有 2 个线程的 C# 代码。它调用 print 方法,但它总是有相同的时间.. 为什么?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace MultiThreading
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(new Program().print));
            Thread thread2 = new Thread(new ThreadStart(new Program().print));
            thread.Name = "Thread1";
            thread2.Name = "thread2";  
            thread.Start();
            thread2.Start();

        }

        public void print()
        {
            Random r = new Random();
            int time = r.Next(3000);
            System.Console.WriteLine(Thread.CurrentThread.Name + ", " + (double)time/1000 + " secs!");
            Thread.Sleep(time);           
        }
    }
}

好的,所以我有 2 个线程,每个线程都有“打印”委托。

print 生成一个数字time什么什么time秒。

thread并且thread2总是生成相同的时间,如何解决?

4

4 回答 4

2

您的困惑不是因为线程,而是因为随机数生成器。

MSDN 说:

随机数生成从种子值开始。如果重复使用相同的种子,则会生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而为每个新的 Random 实例产生不同的序列。

尝试用这个替换你的新随机线,看看有什么不同。

Random r = new Random(Thread.CurrentThread.ManagedThreadId);

我刚刚添加了一个新的随机种子,以便每个线程都获得不同的值。

编辑:代替 ManagedThreadId,您可以使用您选择的任何其他值作为种子值。您需要确保从 Random 对象中获取不同的随机数序列是不同的。至于为什么 ManagedThreadId 不是一个很好的选择,请看下面的评论。

于 2012-12-27T07:41:46.400 回答
1

您可以在线程启动方法之间使用System.Threading.Thread.Sleep方法以间隔启动它们。

thread.Start();
System.Threading.Thread.Sleep(100);
thread2.Start();
于 2012-12-27T07:39:50.860 回答
0

i guess, the problem is the call of the Random() method! Try using different seeds with every Thread otherwise you always get the same random number!

于 2012-12-27T07:50:50.053 回答
0

Randomize()在线程启动之前调用。这会为您的随机函数生成新的种子!

于 2012-12-27T10:00:38.733 回答