Generating random numbers with uniform distribution using Thrust

前端 未结 4 661
礼貌的吻别
礼貌的吻别 2020-12-09 22:41

I need to generate a vector with random numbers between 0.0 and 1.0 using Thrust. The only documented example I could find produces ve

4条回答
  •  忘掉有多难
    2020-12-09 23:18

    Thrust has random generators you can use to produce sequences of random numbers. To use them with a device vector you will need to create a functor which returns a different element of the random generator sequence. The most straightforward way to do this is using a transformation of a counting iterator. A very simple complete example (in this case generating random single precision numbers between 1.0 and 2.0) could look like:

    #include 
    #include 
    #include 
    #include 
    #include 
    
    struct prg
    {
        float a, b;
    
        __host__ __device__
        prg(float _a=0.f, float _b=1.f) : a(_a), b(_b) {};
    
        __host__ __device__
            float operator()(const unsigned int n) const
            {
                thrust::default_random_engine rng;
                thrust::uniform_real_distribution dist(a, b);
                rng.discard(n);
    
                return dist(rng);
            }
    };
    
    
    int main(void)
    {
        const int N = 20;
    
        thrust::device_vector numbers(N);
        thrust::counting_iterator index_sequence_begin(0);
    
        thrust::transform(index_sequence_begin,
                index_sequence_begin + N,
                numbers.begin(),
                prg(1.f,2.f));
    
        for(int i = 0; i < N; i++)
        {
            std::cout << numbers[i] << std::endl;
        }
    
        return 0;
    }
    

    In this example, the functor prg takes the lower and upper bounds of the random number as an argument, with (0.f,1.f) as the default. Note that in order to have a different vector each time you call the transform operation, you should used a counting iterator initialised to a different starting value.

提交回复
热议问题