我想生成介于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类型。那是什么原因?
答案 0 :(得分:4)
(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;
因为你获得了“更好”的随机值。