Soru Std :: random_device iş parçacığı güvenliği


Biraz böyle görünen bir kodum var:

std::random_device rd;

#pragma omp parallel
{
    std::mt19937 gen(rd());
    #pragma omp for
    for(int i=0; i < N; i++)
    {
        /* Do stuff with random numbers from gen() */
    }
}

Bir kaç sorum var:

  • std::random_device iş parçacığı güvenli mi? Yani, birkaç iş parçacığı bir kerede bunu çağırdığında yararsız bir şey yapacak mı?
  • Bu genellikle iyi bir fikir mi? Çakışan rastgele sayı akışları konusunda endişelenmeli miyim?
  • İstediğim şeyi elde etmenin daha iyi bir yolu var mı (her bir iplikteki bağımsız rasgele sayı akışları - şu anda çoğaltılamazlık konusunda endişelenmiyorum)?

Çalışmalarında herhangi bir fark yaratması durumunda std::random_device Öncelikle Windows üzerinde çalışıyorum, ancak kodun Linux ve OSX üzerinde de aynı derecede iyi çalışmasını istiyorum.


17
2018-02-10 10:43


Menşei


Yeniden üretilebilirlik elde edebilirsiniz, ancak kullanmak yerine belirli bir tohum kullanabilirsiniz. std::random_device. - Galik
random_device büyük olasılıkla engelleniyor. İstediğiniz şey paralellik ise, onu böyle kullanmanın pek bir anlamı yoktur. İle tohumlanmış küresel bir PRNG kullanabilirsiniz random_device tohumlamak mt19937 (ama açık kilitlemeye ihtiyaç duyacaktır). - sbabbi
Ayrıca bakınız, stackoverflow.com/a/21238187/314290 - Mikhail


Cevaplar:


Rastgele aygıtı paralel olarak kullanmak iyi bir fikir değildir. Engelleme olsa bile, çakışan rastgele sayı akışlarıyla ilgili sıkıntılarınız olmayabilir, ancak ek bir senkronizasyon noktası eklersiniz.

Başlamak istediğiniz birçok iş parçacığı kadar çok sayıda rasgele sayı motoru (RNE) kurmalısınız. omp_get_num_threads(). Bir std :: RNE'leri oluşturun ve bunları programınızın ardışık kısmında toplayın. Tohumlama için rastgele cihazı kullanabilirsiniz. std :: seed_seq.

Daha sonra, iş parçacığı numarası ile ilişkili olan her bir iş parçacığında kullanın, omp_get_thread_num().

Rastgele sayıları rasgele sayılar üretmek için kullanmayın, onun yavaş ve genel olarak eşit dağıtılmış rastgele sayı üretmemesi!

İhtiyacınız olan rasgele sayıların kalitesine bağlı olarak, önceden tanımlanmış rasgele sayı üreteçlerinden birini kullanabilirsiniz. Monte Carlo simülasyonları yapıyorsanız veya Kriptografi seçerseniz hangi algoritmayı seçtiğinize dikkat edin.

Rastgele motorlarda çok yararlı bilgiler bulabilirsiniz. https://en.cppreference.com/w/cpp/numeric/random.


0
2017-07-16 16:03