且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

使用 Thrust 生成均匀分布的随机数

更新时间:2023-02-10 13:56:47

Thrust 有随机生成器,可用于生成随机数序列.要将它们与设备向量一起使用,您需要创建一个函子,该函子返回随机生成器序列的不同元素.最直接的方法是使用计数迭代器的转换.一个非常简单的完整示例(在这种情况下生成 1.0 和 2.0 之间的随机单精度数)可能如下所示:

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 <thrust/random.h>
#include <thrust/device_vector.h>
#include <thrust/transform.h>
#include <thrust/iterator/counting_iterator.h>
#include <iostream>

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<float> dist(a, b);
            rng.discard(n);

            return dist(rng);
        }
};


int main(void)
{
    const int N = 20;

    thrust::device_vector<float> numbers(N);
    thrust::counting_iterator<unsigned int> 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;
}

在本例中,仿函数 prg 将随机数的上下界作为参数,(0.f,1.f) 作为默认.请注意,为了每次调用变换操作时都有不同的向量,您应该使用初始化为不同起始值的计数迭代器.

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.