#cpp #случайные_числа
Не могу понять как заставить генератор случайных чисел давать дробные значения.
Пробовал сделать так.
A = rand() % 158.691+(-1.235);
не получилось.
Интервал от -1.235 и 157.456.
#include
#include
#include
using namespace std;
int main()
{
int N,M;
int max = 157456, min = -1235;
cout << "Enter size of matrix A:N " << endl;
cin >> M;
cout << "Enter size of matrix A:M " << endl;
cin >> N;
cout << "Creating matrix A:" << endl;
// Создаётся матрица A
float **A = new float* [M];
srand(time(NULL));
int i = 0;
do {
A[i] = new float [N];
i++;
}
while(i
Ответы
Ответ 1
На самом деле всё просто.
// Генерирует случайное действительное число от 0 до 1
(double)(rand())/RAND_MAX
// Генерирует случайное действительное число от 0 до N
(double)(rand())/RAND_MAX * N
Вот пример:
#include
#include
#include
using namespace std;
// Функция, генерирующая случайное действительное число от min до max
double random(double min, double max)
{
return (double)(rand())/RAND_MAX*(max - min) + min;
}
int main()
{
srand((unsigned int)time(0));
cout << random(-1.235, 157.456) << endl;
return 0;
}
Здесь проверка.
Ответ 2
Все вышеперечисленные способы сводятся примерно к одной формуле:
res = min + (max - min) / RAND_MAX * rand();
Тут могут быть проблемы, если число значащих цифр в RAND_MAX меньше, чем в мантиссе
результирующего типа. Такое может случиться, даже если res имеет тип float (RAND_MAX
далеко не всегда равен INT_MAX, а может быть намного меньше). Возможно, что и в противном
случае, с распеределением что-то будет не так, не могу сказать точно.
Поэтому, не может не радовать, что разработчики стандарта позаботились о нас и добавили
в стандартную библиотеку новый модуль .
#include
#include
#include
int main() {
const double from = -1.235;
const double to = 157.456;
using namespace std::chrono;
std::default_random_engine engine(
system_clock::to_time_t(system_clock::now()));
std::uniform_real_distribution<> distr(from, to);
auto gen_number = [&engine, &distr] () { return distr(engine); };
for (int i = 0; i < 50; ++i) {
std::cout << gen_number() << std::endl;
}
}
Ответ 3
Вот так работает?
double мин = -1.235;
double макс = 157.456;
int мин__ = (int)(мин*1000);
int макс__ = (int)(макс*1000);
long long число = rand();
число = число%(макс__ - мин__) + мин__;
double результат = (double)число / (double)1000;
std::cout << "\nрезультат=" << результат;
Проверка:
for(int i = 0; i < 1000000; i++)
{
int min = -1235;
int max = 157456;
//
srand(наносекунды);
long long D = rand();
D = D%(max - min) + min;
double result = (double)D / (double)1000;
if(result < -1.235)
{
std::cout << "\nменьше=" << result;
}
if(result > 157.456)
{
std::cout << "\nбольше=" << result;
}
}
@
Вот ваш код.
#include
#include
#include
using namespace std;
int main(){
int N,M;
int max = 157456, min = -1235;
cout << "Enter size of matrix A:N " << endl;
cin >> M;
cout << "Enter size of matrix A:M " << endl;
cin >> N;
cout << "Creating matrix A:" << endl;
// Создаётся матрица A
float **A = new float* [M];
srand(time(NULL));
int i = 0;
do {
A[i] = new float [N];
i++;
}
while(i
Ответ 4
srand(time(NULL));
double a = (double)(rand()%10000);
ну и соответственно добавьте слагаемые-множители для соблюдения требуемого диапазона
Ответ 5
Не уверен что с цифрами правильно высчитал, так что если подойдёт такое решение сами
пере проверти, что бы он нужные вам числа выдавал.
#include
#include
#include
int main()
{
srand(time(0));
double result;
int celoe = 0, drobi = 0, znak = 0;
char buff[10];
znak = rand() % 2; // 1
buff[0] = znak ? ' ' : '-';
if (buff[0] == '-') { // 2
celoe = rand() % 2; // Генерирует от 0 до 1
drobi = rand() % 236; // Генерирует от 0 до 235
sprintf(&buff[1], "%d.%d", celoe, drobi); // 4
} else { //3
celoe = rand() % 158; // Генерирует от 0 до 157
drobi = rand() % 457; // Генерирует от 0 до 456
sprintf(buff, "%d.%d", celoe, drobi); // 4
}
result = atof(buff); // 5
std::cout << result << "\n"; // 6
system("pause");
return 0;
}
Генерируем число от 0 до 1 которое будет определять знак будущего дробного числа.
Проверяем если у нас число будет отрицательным то генерируем значения из диапазона
чисел которые могут входить в отрицательное дробное число.
Ну а если число положительное то для положительного генерируем числа из нужного вам
диапазона.
Здесь мы создаём из получившихся чисел строку с дробным числом.
Преобразуем строку с числом в число double
Выводим результат
P.S. Народ если есть простой способ генерировать дробные значения то отпишитесь,
может зря я такую муть городил на ночь глядя ))
А можно вынести в отдельную функцию и при вызове функции передавать нужные диапазоны
и получать результат.
#include
#include
#include
double generate(int min_celoe, int min_drobi, int max_celoe, int max_drobi)
{
double result;
int celoe = 0, drobi = 0, znak = 0;
char buff[10];
znak = rand() % 2;
buff[0] = znak ? ' ' : '-';
if (buff[0] == '-') {
celoe = rand() % (min_celoe + 1);
drobi = rand() % (min_drobi + 1);
sprintf(&buff[1], "%d.%d", celoe, drobi);
} else {
celoe = rand() % (max_celoe + 1);
drobi = rand() % (max_drobi + 1);
sprintf(buff, "%d.%d", celoe, drobi);
}
result = atof(buff);
return result;
}
int main()
{
srand(time(0));
double results[100];
for (int i = 0; i < 100; i++) {
results[i] = generate(1, 235, 157, 456);
std::cout << results[i] << "\n";
}
system("pause");
return 0;
}
Комментариев нет:
Отправить комментарий