gpt4 book ai didi

c# - 每个线程另一个随机数

转载 作者:行者123 更新时间:2023-12-03 13:19:58 25 4
gpt4 key购买 nike

我有简单的类来生成随机数:

public class Bar
{
Random rnd = new Random();
public int GenerateRandomNumber()
{
return rnd.Next(1, 100);
}
}

然后在第二类中使用它,在其中创建两个线程。通过使用bar类中的函数,每个线程都在控制台自己的ID和随机数上进行写操作。如下图所示:
public class Foo
{
Thread t1;
Thread t2;
Bar bar;
public Foo(Bar bar)
{
t1 = new Thread(GetRandomNumber);
t2 = new Thread(GetRandomNumber);
this.bar = bar;
}

public void Start()
{
t1.Start();
t2.Start();
}

private void GetRandomNumber()
{
Console.WriteLine("Thread {0} {1}", Thread.CurrentThread.ManagedThreadId,bar.GenerateRandomNumber());
}
}

所以总的来说,我有:
static void Main(string[] args)
{
Bar bar1 = new Bar();
Bar bar2 = new Bar();

Foo f1 = new Foo(bar1);
Foo f2 = new Foo(bar2);

f1.Start();
f2.Start();
Console.ReadLine();
}

在控制台中,我可以得到一些类似的东西:
Thread 11 34
Thread 12 9
Thread 13 34
Thread 14 9

我的问题是我该怎么做才能在每个线程中获取另一个数字?

最佳答案

您需要使用所谓的seed初始化随机数生成器,不同的线程会有所不同。最简单的方法是:

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

更新
在代码中,您只发布了一行的简单更改将无济于事。
为了使其正常工作,您必须以某种方式进行更改,以便每个线程都具有自己的 Random实例。那将是这样的:
public class Foo
{
Thread t1;
Thread t2;
public Foo(Func<Bar> getBar)
{
t1 = new Thread(()=>GetRandomNumber(getBar()));
t2 = new Thread(()=>GetRandomNumber(getBar()));
}

public void Start()
{
t1.Start();
t2.Start();
}

private void GetRandomNumber(Bar bar)
{
Console.WriteLine("Thread {0} {1}", Thread.CurrentThread.ManagedThreadId,bar.GenerateRandomNumber());
}
}

static void Main(string[] args)
{
Foo f1 = new Foo(()=>new Bar());
Foo f2 = new Foo(()=>new Bar());

f1.Start();
f2.Start();
Console.ReadLine();
}

关于c# - 每个线程另一个随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23614295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com