2013-09-26 2 views
0

Я хочу заполнить вектор устройства со случайными значениями в диапазоне [-3.2, 3.2). Вот код, который я написал для создания этого:Почему равномерное случайное распределение Thrust генерирует неправильные значения?

#include <thrust/random.h> 
#include <thrust/device_vector.h> 

struct RandGen 
{ 
    RandGen() {} 

    __device__ 
    float operator() (int idx) 
    { 
     thrust::default_random_engine randEng(idx); 
     thrust::uniform_real_distribution<float> uniDist(-3.2, 3.2); 
     return uniDist(randEng); 
    } 
}; 

const int num = 1000; 
thrust::device_vector<float> rVec(num); 
thrust::transform(
       thrust::make_counting_iterator(0), 
       thrust::make_counting_iterator(num), 
       rVec.begin(), 
       RandGen()); 

Я считаю, что вектор заполняется значениями как это:

-3.19986 -3.19986 -3.19971 -3.19957 -3.19942 -3.05629 -3.05643 -3.05657 -3.05672 -3.05686 -3.057 

На самом деле, я не мог найти единственное значение, которое больше нуль!

Почему это не создает случайные значения из диапазона, который я установил? Как это исправить?

+0

Возможный дубликат [Генерация вектора случайных чисел между 0 и 1.0 с использованием Thrust] (http://stackoverflow.com/questions/12614164/generating-a-random-number-vector-between-0-and-1- 0-с помощью тяги) – talonmies

ответ

2

Вы должны вызвать функцию randEng.discard(), чтобы сделать поведение случайным.

__device__ float operator() (int idx) 
{ 
    thrust::default_random_engine randEng; 
    thrust::uniform_real_distribution<float> uniDist(-3.2, 3.2); 
    randEng.discard(idx); 
    return uniDist(randEng); 
} 

P.S: Обратитесь к this answer по talonmies.

Смежные вопросы