如何使用线程在 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));
}