我有一个使用多线程的基本程序。调用线程过程时,每个线程需要使用不同的随机数。我已尝试在线程过程中播种随机数生成器,但我为每个线程获得相同的随机数。这是我正在做的简单版本:
public ref class ThreadX
{
public:
void ThreadProc()
{
srand(time(NULL));
Console::WriteLine(rand()); //Will output same random numbers
}
}
int main(){
ThreadX^ process1 = gcnew ThreadX(gasStationATM);
Thread^ Thread1 = gcnew Thread(gcnew ThreadStart(process1, &ThreadX::ThreadProc));
Thread^ Thread2 = gcnew Thread(gcnew ThreadStart(process1, &ThreadX::ThreadProc));
Thread1->Start();
Thread2->Start();
}
我最初想到的是当第二个线程启动时,第二个线程启动时,种子的时间会有所不同,并为第二个数字提供一系列不同的随机数。如何在C ++ CLI中对srand进行种子处理,以便每个线程生成随机数。
答案 0 :(得分:1)
另一个选择是在main
主题中使用单个中央RNG。在创建每个新线程时,使用来自中央RNG的下一个号码为线程自己的RNG播种。这样做的另一个好处是,如果需要,您可以通过向中央RNG提供特定种子来重复运行。该技术可用于重复(并因此修复)错误。
答案 1 :(得分:1)
创建Random
实例时,请使用constructor that lets you specify a seed value。默认构造函数使用当前系统时间作为种子值,因此同时创建的两个实例将使用相同的种子,因此产生相同的随机数序列。
对于种子值,有两个选项可用于指定不同的值:您可以使用正在运行的某个值unique to the thread,也可以使用您管理的唯一编号。
Random^ GetRandom1()
{
return gcnew Random(Thread::CurrentThread->ManagedThreadId);
}
static int uniqueID = 0;
Random^ GetRandom2()
{
return gcnew Random(Interlocked::Increment(uniqueID));
}
答案 2 :(得分:0)
srand(time(NULL) + rank)
将完成这项工作。
目前,您的种子不是特定于线程的。当生成所有线程时,它们几乎具有相同的time(NULL)
,因此每个线程的种子值都相同。为避免这种情况,您可以使用线程等级作为种子或任何其他线程特定变量。