Другие языки программирования и технологии

Как делить с остатком в C++

srand(time(NULL));
float f = rand()%10/10;
std::setprecision(2);
std::cout << f;

Проблема: откидывается остаток
Цель: нужен рандом от 0.0 до 0.9 с шагом 0.1 (для рандомизации цвета в Open GL)
#include <iostream>
#include <random>
#include <vector>
#include <iomanip>
using namespace std;
double randomize(double beg, double end, int sign);
vector<double> create_collection(vector<double>::size_type quantity, double left, double rigth, int prec);
void print_collection(vector<double>& collection, streamsize width, streamsize prec);
int main() {
int prec = 1; // определяет количество знаков после точки
vector<double> collection = create_collection(24, 0, 0.9, prec);
print_collection(collection, 4, prec);
cin.get();
}
void print_collection(vector<double>& collection, streamsize width, streamsize prec) {
for (auto &element : collection) cout << setw(width) << fixed << setprecision(prec) << element << '\n';
}
vector<double> create_collection(vector<double>::size_type quantity, double left, double rigth, int prec) {
vector<double> collection;
for (vector<double>::size_type i = 0; i < quantity; ++i) collection.push_back(randomize(left, rigth, prec));
return collection;
}
double randomize(double beg, double end, int prec) {
uniform_real_distribution<double> rand(beg, end);
random_device rnd;
double num = rand(rnd);
double exponent = pow(10, prec);
int tmp = static_cast<int>(num * exponent);
return tmp / exponent;
}
Сергей Гребёнкин
Сергей Гребёнкин
97 409
Лучший ответ
/ означает целочисленное деление, если оба операнда int. Ниже правильные варианты:
Самая простая запись:
float f = rand()%10/10.0;//последний операнд - double, поэтому деление будет не целочисленным
Самая короткая запись:
float f = rand()%10/10.; //C++ понимает такую форму записи, но для нас она непривычная
Самая правильная (IMHO) запись
float f = float( rand() % 10 ) / 10.0f; //прямо указываем преобразование
Самая строгая запись:
float f = static_cast( rand() % 10 ) / 10.0f;
Ну а еще можно объявить свою функцию вроде float random( float min, float max, float step) и вызывать ее...
Евгений Пономарев Большое спасибо. Очень понятно обяснил)