簡體   English   中英

在C中的多線程程序中創建隨機數

[英]Creating random numbers in a multithreaded program in C

我正在編寫一個程序,其中有工作線程創建0到3之間從0到x-1(變量)的隨機數

我需要學習的是如何在C中生成這些隨機數。

我正在使用gcc編譯器並在Ubuntu 11.10上工作

rand()srand()不是那種可以安全使用的東西。

它們既不是重入也不是線程安全 一般而言,C或C ++標准都不對任何標准庫函數提出有關線程安全性的任何要求。
某些實現可能確實提供了線程安全版本,但標准並未強制要求。

為了能夠在多線程環境中使用隨機數生成器,您將需要一個允許傳入狀態的實現。 這樣,您可以為每個線程保留一個狀態值,並生成高質量的隨機數,而無需同步。

C標准庫不提供任何選擇。 這使得100%的可移植性變得相當不可能。使用的選擇將取決於您的環境,您應該將其作為問題的一部分來提供以獲得准確的答案。

看看聲稱提供MultiThreaded隨機數發生器的 GNU科學圖書館

如果你只是想要一些隨機數並且不關心是否獨立生成隨機數序列,你仍然可以使用rand()srand()

    #include <stdlib.h>                       
    #include <stdio.h>                        
    #include <pthread.h>                      
    #include <unistd.h>                       

    void* cb1(void*) {                        
        while(1) {                            
            printf("cb1, rand:%d\n",rand());  
            sleep(1);                         
        }                                     
    }                                         

    void* cb2(void*) {                        
        while(1) {                            
            printf("cb2, rand:%d\n",rand());  
            sleep(1);                         
        }                                     
    }                                         


    int main() {                              
        pthread_t  th1, th2;                  
        srand(1);                             
        pthread_create(&th1, NULL, cb1, NULL);
        pthread_create(&th2, NULL, cb2, NULL);

        pthread_join(th1, NULL);              
        pthread_join(th2, NULL);              

        return 0;                             
    }                                         

使用rand_r() (見rand(3))

函數rand_r()提供了一個指向unsigned int的指針,用作狀態。

它是可重入的並且將種子作為輸入,因此線程可以分別管理它們的種子。

一個真理和美麗的東西;

http://en.wikipedia.org/wiki/Mersenne_twister

編寫自己的RNG。

(道歉。我剛看了那個維基頁面。最后我看了一會兒,很好;你可以讀它並實現扭轉。現在這是一堆學位水平的數學,這對任何人都沒有任何解釋,禁止在大學學習數學學習四年的人口子集。我看到這在維基上發生了很多:-(

一個簡單的版本,缺少錯誤檢查,使用C11的threads.h看起來像這樣:

mtx_t rand_mtx;

//run only once.
int rand_init(int seed)
{
     srand(seed);
     mtx_init(&rand_mtx, mtx_plain);
} 

int synced_rand()
{
    mtx_lock(&rand_mtx);
    int r = rand();
    mtx_unlock(&rand_mtx);
    return r;
}

暫無
暫無

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

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