如何使用线程在 C++/CLI 中播种 Random^?
How to seed Random^ in C++ / CLI with threads?
我有一个使用多线程的基本程序。每个线程在调用线程过程时需要使用不同的随机数。我已经尝试在线程过程中植入随机数生成器,但我为每个线程获得了相同的随机数。这是我正在做的一个简单版本:
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 以便每个线程生成随机数。
srand(time(NULL) + rank)
将完成这项工作。
目前,您的种子不是特定于线程的。当生成所有线程时,它们几乎具有相同的 time(NULL)
,因此每个线程的种子值都相同。为避免这种情况,您可以使用线程等级作为种子,或任何其他线程特定变量。
另一种选择是在您的 main
线程中使用单个中央 RNG。在创建每个新线程时,使用中央 RNG 中的下一个数字为线程自己的 RNG 播种。这还有一个优点,即如果需要,您可以通过为中央 RNG 提供特定种子来准确地重复 运行。该技术可用于重复(并因此修复)错误。
当您创建 Random
instance, use the 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));
}
我有一个使用多线程的基本程序。每个线程在调用线程过程时需要使用不同的随机数。我已经尝试在线程过程中植入随机数生成器,但我为每个线程获得了相同的随机数。这是我正在做的一个简单版本:
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 以便每个线程生成随机数。
srand(time(NULL) + rank)
将完成这项工作。
目前,您的种子不是特定于线程的。当生成所有线程时,它们几乎具有相同的 time(NULL)
,因此每个线程的种子值都相同。为避免这种情况,您可以使用线程等级作为种子,或任何其他线程特定变量。
另一种选择是在您的 main
线程中使用单个中央 RNG。在创建每个新线程时,使用中央 RNG 中的下一个数字为线程自己的 RNG 播种。这还有一个优点,即如果需要,您可以通过为中央 RNG 提供特定种子来准确地重复 运行。该技术可用于重复(并因此修复)错误。
当您创建 Random
instance, use the 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));
}