生成浮点随机数

时间:2010-11-12 07:58:20

标签: c++

我想生成介于0和1之间的浮点数,这是我的代码

    struct generate_rand
    {
        generate_rand()
        {
            srand(time(NULL));
        }
        float operator()()
        {
            return (rand()%255)/255;
        }
    }generate_f;

    std::vector<float> color(200);
    std::generate(color.begin(), color.end(), generate_f);

但是向量包含所有ZERO,编译器会产生一个警告:'return':从'int'转换为'float',可能会丢失数据。如果我像这样修改代码,return rand()/255;结果都是int类型。那是什么原因?

4 个答案:

答案 0 :(得分:4)

正如Naveen所说,整数算术会使它成为整数结果。此外,您可能需要考虑使用

(float) rand() / RAND_MAX

以更好的粒度从0到1获取数字。

答案 1 :(得分:3)

有人已经回答了您的确切问题。但也许您会对使用引导库的不同方法感兴趣吗?

如有兴趣,请查看此链接boost以及以下示例:

#include <iostream>
#include <boost/random.hpp>
#include <time.h>
using namespace std;
using namespace boost;

int main ( )  {

    uniform_real<> distribution(0, 1) ;
    mt19937 engine; 
    engine.seed(time(NULL));   
    variate_generator<mt19937, uniform_real<> > myrandom (engine, distribution);

    for (int i=0; i<3; ++i)
        cout << myrandom() << endl;

}

答案 2 :(得分:2)

问题是(rand()%255)/255执行整数除法,因为它的所有操作数都是整数。因此结果始终为0.您应该将其中一个更改为float。最简单的方法是使用255.0作为除数。

答案 3 :(得分:2)

Naveen回答正确。尽管如此,更好的方法是这个:

struct generate_rand
{
    generate_rand()
    {
        srand(time(NULL));
    }
    float operator()()
    {
        return rand()/(float)RAND_MAX;
    }
} generate_f;

因为你获得了“更好”的随机值。