C/C++

Как реализовать программу, в которой массив заполняется рандомно, а сумма его элементов всегда будет равна 1? С++

Массив размером, например 7. Диапазон рандомных чисел от 0.01 до 1. Ну если с таким диапазоном чисел реализовать невозможно, можно и другой.. :)
Дмитрий
Дмитрий
173
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <random>
using namespace std;
void create(double* box, int n) {
uniform_int_distribution<> index(0, n - 1);
uniform_int_distribution<> value(1, 67);
mt19937 gen{ random_device()() };
auto tmp = new int[n];
fill(tmp, tmp + n, 1);
const auto m = 100 - n;
if (m < 0) exit(0);
if (m == 0) {
fill(box, box + n, .01);
return;
}
auto count = 0;
do {
auto x = value(gen);
if (x + count <= m) {
tmp[index(gen)] += x;
count += x;
}
} while (count < m);
for (int i = 0; i < n; ++i) box[i] = tmp[i] / 100.;
delete[] tmp;
}
int main() {
const auto n = 7;
double box[n];
create(box, n);
cout << fixed << setprecision(2);
for (const auto x : box) cout << setw(6) << x;
puts("\n");
system("pause > nul");
}
BK
Batyrzhan Konysbaev
61 237
Лучший ответ
Ерик Картанбаев Это ещё хорошо, что автор не знает, что у случайных чисел есть функция плотности вероятности)
#include "iostream"
#include "ctime"
#include "cstdlib"
using namespace std;
int main(){
double s=0,a[7]; srand(time(NULL));
for(double &i:a)i=rand()%100/100.+.01, s+=i;
for(double &i:a)i/=s;
s=0; for(double &i:a)cout<<i<<' ',s+=i;
cout<<"\nsum="<<s<< endl;}
Аман Джукебаев
Аман Джукебаев
83 423
Нужно просто произвести нормализацию. Пусть сгенерированный массив состоит из N случайных чисел из диапазона, скажем, [0,01;1]. Тогда находим сумму всех элементов массива и делим на неё каждый элемент массива. Тогда получится массив с единичной суммой...
Фёдор Бредихин
Фёдор Бредихин
28 648
Сергей Бережнов если сумма массива будет сильно больше единицы и будут достаточно маленькие элементы, после нормализации они могут вылезти за нижнюю границу интервала

Похожие вопросы