簡體   English   中英

MPI中每個進程的隨機數

[英]Random Number to each Process in MPI

我正在使用 MPICH2 來實現“奇偶”排序。 我做了實現,但是當我隨機化每個進程他的值時,相同的數字被隨機化到所有進程。

這是每個進程的代碼,每個進程隨機化他的值..

int main(int argc,char *argv[])
{
    int  nameLen, numProcs, myID;
    char processorName[MPI_MAX_PROCESSOR_NAME];
    int myValue;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&myID);
    MPI_Comm_size(MPI_COMM_WORLD,&numProcs);    
    MPI_Get_processor_name(processorName,&nameLen);
    MPI_Status status;

    srand((unsigned)time(NULL));
    myValue = rand()%30+1; 

    cout << "myID: " << myID << " value: " << myValue<<endl;
    MPI_Finalize();

    return 0;
 }

為什么每個進程得到相同的值?

編輯:感謝您的回答:)

我換了線

 srand((unsigned)time(NULL));

 srand((unsigned)time(NULL)+myID*numProcs + nameLen);

它為每個過程提供了不同的值:)

這個任務並不簡單。

您得到相同的數字,因為您使用time(0)初始化srand() time(0) time(0)所做的是返回當前秒(自紀元以來)。 因此,如果所有進程都具有同步時鍾,那么只要它們在同一秒調用srand() ,所有進程都將使用相同的種子進行初始化,這很有可能。 我什至在大型機器上也觀察到了這一點。

解決方案 1. 使用本地值來初始化隨機種子。

我所做的是將來自cat /proc/meminfo/dev/random一些內存使用包含到計算隨機種子中,這些內存使用對物理機器來說比時鍾更本地化。 請注意,對於 1 台機器上的 N 個任務,這可能仍然失敗。 但如果我沒task_id話,我也使用了task_id 任何本地任務就足夠了。 組合東西也是個好主意。 畢竟,與實際計算相比,這些計算應該非常短。 最好保持安全。

解決方案 2. 計算種子作為預處理步驟。

您還可以使用您的方法從task 0生成隨機種子,並使用send-to-all傳播它。 但是,在進行大規模(例如 10^5 個進程)時,它可能會遇到擴展問題。 您還可以使用任何其他方法來加載參數,並僅將種子准備作為預處理步驟。 然而,它也涉及一些非平凡的工作。

這是因為你的種子變化不夠,隨機性取決於你的種子。

srand文檔

對於 srand 調用中使用的每個不同種子值,偽隨機數生成器可以預期在隨后的 rand 調用中生成不同的結果序列。

編輯:嘗試預先生成種子或為每個srand調用手動更改種子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM