我有以下代码:
Thread[] threadArray= new Thread[3];
MyObject[] objectArray = new MyObject[3];
for (int i = 0; i < 3; i++)
{
//Create new HotelSupplier object
objectArray[i] = new MyObject();
//Create array of threads and start a new thread for each HotelSupplier
threadArray[i] = new Thread(new ThreadStart(objectArray[i].run));
//Store the name of the thread
threadArray[i].Name = i.ToString();
//Start the thread
threadArray[i].Start();
}
我创建了3个对象和3个线程。所有对象都存储在一个数组中,所有的线程都存储在一个数组中。
MyObject中的run方法在min和max之间生成一个随机数
Random random = new Random();
double min = 50.00;
double max = 500.00;
double price = random.NextDouble() * (max - min) + min;
Console.WriteLine("GENERATING PRICE: " + price);
我的输出:
GENERATING PRICE: 101.271334780041
GENERATING PRICE: 101.271334780041
GENERATING PRICE: 101.271334780041
我期待3个不同的随机数,而不是只有一个,因为我认为每个线程都会在不同的对象上运行。
我做错了什么,我对线程有什么不了解?
答案 0 :(得分:1)
您的原始代码导致所有Random
个实例都以相同的值播种。
解决此问题的最低影响方式是移动代码以创建Random
:
void Run()
{
//...
Random random = new Random();
//...
}
在Run
方法之外并进入private static
变量,因此它变为:
private static Random random = new Random();
void Run()
{
//...
}
所以它只会在MyObject
的所有实例中播种一次。
答案 1 :(得分:0)
这是因为Random用当前时间播种,但时间分辨率通常只有15ms。换句话说,你的三个随机发生器在相同的15ms帧内被初始化的几率非常高,它们都具有相同的种子,因此都会产生相同的值。
我建议你在初始线程上创建一个第一个随机生成器,产生三个随机值,并将它们用作其他线程的种子&#39;发电机。