Entegre bir değer türü alan ve işlevin içine geçirdiğiniz yineleyicilerin kapsayıcının sınırlarını aşmayacak bazı tümleşik türden başka bir değer döndüren rasgele sayı üreteci işlevi veya functor nesnesi sağlamanız gerekir. ile yinelenen. Ayrıca bir functor nesnesi durumunda, bir fonksiyon gibi çağrılabilmesi için operator()
'u uygulamalıdır. srand
ve'dan rand
'u kullanarak bir iş parçacığı güvenli rasgele sayı üretecine gereksiniminiz kötü bir fikirdir ... bunun yerine, bir iş parçacığı güvenli rasgele sayı üreteci veya rasgele sayı üreteci uygulayan bir functor nesnesi oluşturmanız gerekir. Küresel olarak erişilebilir değişkenleri uygulamamaktadır, böylece her şey iplik yerel depolama alanı olarak kalmaktadır.
Örneğin, bunun işe yaramasının bir yolu, başka bir kitaplıktan aldığınız bir çeşit rasgele sayı üretecine sahip olmanızdır; bu, yalnızca sabit bir değerler aralığı arasında rastgele değerler üretecek ve böylece kapsayıcının sınırlarını tanımlayabilirsiniz. rasgele erişim yineleyicileri için random_shuffle
algoritması kullanır. Şimdi kullandığınız kütüphane bağlı olarak, funktoru gibi bir şey olabilir şunlardır:
Şimdi
class my_rand_gen
{
private:
random_gen_type random_range_gen;
int min;
int max;
public:
my_rand_gen(const random_gen_type& gen, int min_range, int max_range):
random_range_gen(gen), min(min_range), max(max_range) {}
int operator()(int value)
{
//ignore the input value and use our own defined range
//returns a value between min and max
return random_range_gen(min, max);
}
};
sizin gibi algoritma arayabilirsiniz:
random_shuffle(my_vector_start_iter, my_vector_end_iter,
my_rand_gen(rand_generator_lib,
vector_start_index,
vector_end_index));
ve başından arasına-vektör olarak karıştırılır ve vektörün sınırlarını taşmadan yineleyicilerinizi sonlandırın ... diğer bir deyişle, yalnızca vector_start_index
ve vector_end_index
arasındaki shuffle değerlerini kullanır.
:
Sen gibi
random_shuffle
şey ile kullanmak istiyorum Belgeleme aksi belirtilmedikçe, iş parçacığı güvenlidir. –Ayrıca, 'threadafe' çok aşırı yüklü bir terimdir. Bazı algoritmalar, yalnızca güvenli veriler üzerinde çalışıyorlarsa güvenlidir. Bazıları sadece 1 yazar olduğu sürece iş parçacıkları için güvenlidir ve çoğu bunu garanti edemez. Genel olarak, neyin güvenli olduğuna karar verirken (örneğin, doğru), çeşitli okuma/yazma gereksinimlerini belirtmeniz gerekir. – Kylotan
Sadece açıklığa kavuşturmak için, farklı listelerde paralel olarak karıştırmak istiyorum.Bu yüzden veri yapısındaki ırklar hakkında endişe duymuyorum, sadece karışıklık için rastgele sayıların yaratılması. – Mark