使用推力生成0和1.0之间的随机数向量 [英] Generating a random number vector between 0 and 1.0 using Thrust

查看:274
本文介绍了使用推力生成0和1.0之间的随机数向量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要使用Thrust生成一个0和1.0之间的随机数的向量。我能找到的唯一记录的例子产生非常大的随机数(thrust :: generate(myvector.begin(),myvector.end(),rand):
我相信答案很简单,但我会谢谢任何建议。

I need to generate a vector with random numbers between 0 and 1.0 using Thrust. The only documented example I could find produces very large random numbers (thrust::generate(myvector.begin(), myvector.end(), rand):. I'm sure the answer is simple, but I would appreciate any suggestions.

推荐答案

Thrust有随机生成器,可用于产生随机数序列。你将需要创建一个函数返回一个不同的随机生成器序列的元素,最直接的方法是使用一个计数迭代器的变换一个非常简单的完整例子(在这种情况下,和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)作为默认值。注意,为了在每次调用transform操作时都有一个不同的向量,你应该使用一个计数迭代器初始化一个不同的起始值。

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.

这篇关于使用推力生成0和1.0之间的随机数向量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆