2012-10-13 15 views
5

'u eklerken, rand_r işlevini kullanacak birden çok iş parçacığım var. Bu fonksiyonun imzası: Ben bu işlevi tohuma zaman kullanmaya çalışıyordu ama sorun her türlü yaşıyorumUygun rand_r (int * val) yöntemi

int rand_r(int *val); 

. Kim bana rand_r'yi zaman kullanarak veya rand_r'ı dinamik olarak ekmenin başka basit bir yolunu nasıl arayacağımı açıklayabilir.

Teşekkürler!

+0

Lütfen kılavuza bakın> http://linux.die.net/man/3/rand_r – MByD

+0

Her türlü sorun nedir? Lütfen spesifik olalım, böylece yardımcı olabiliriz. –

+0

Merhaba @Thomas Bunun bütün formlarını kullanmaya çalıştım. Ve sanırım işaretçilerle çok fazla sorun yaşıyorum. Yapmaya çalıştım: rand_r ((imzasız int *) time (null)) ve derleme ile ilgili bir sorunla karşılaşmadım ama çalışırken segmentasyon hatası var. – user1742385

cevap

9

Yeniden girilen sürüm rand_r için, tohum durumun yalnızca başlangıç ​​değeridir. Ya tohumların bir dizi oluşturabilir veya tohumu bu değişken iplik-yerel yapmak: Her iş parçacığı için bir tohum almak için yeterli bayt okuma, başlangıçtaki rastgele sayılar için /dev/urandom açabilir UNIX/POSIX sisteminde

_Thread_local unsigned int seed = time(NULL); 

int do_stuff() 
{ 
    for (; ;) 
    { 
     int n = rand_r(&seed); 
     // use n 
    } 
} 
+1

+1 argümanı olarak kullanmalısınız. Belki de tüm derleyicilerin doğrudan desteklemediğini, ancak belki de benzer bir uzantıya sahip olduğunu, C11'deki thread desteğinin isteğe bağlı olduğunu ve belirtilen kullanımın "thread.h" yi içerdiğini ve güzel makroyu kullanacağını eklemeliyim. 'yerine. –

0

. Microsoft Windows'un bu sayıları almak için daha ayrıntılı bir yolu vardır. Ayrıntılar için CryptGenRandom'a bakın. Bunlar sistem entropisine dayandığından, yüksek hacimli rasgele sayılar için değildirler.

İlgili konular