如何使用线程在C ++ / CLI中播种Random ^?

时间:2016-04-24 11:44:17

标签: multithreading random c++-cli

我有一个使用多线程的基本程序。调用线程过程时,每个线程需要使用不同的随机数。我已尝试在线程过程中播种随机数生成器,但我为每个线程获得相同的随机数。这是我正在做的简单版本:

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进行种子处理,以便每个线程生成随机数。

3 个答案:

答案 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),因此每个线程的种子值都相同。为避免这种情况,您可以使用线程等级作为种子或任何其他线程特定变量。