C/C++
Как реализовать программу, в которой массив заполняется рандомно, а сумма его элементов всегда будет равна 1? С++
Массив размером, например 7. Диапазон рандомных чисел от 0.01 до 1. Ну если с таким диапазоном чисел реализовать невозможно, можно и другой.. :)
#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");
}
#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");
}
Ерик Картанбаев
Это ещё хорошо, что автор не знает, что у случайных чисел есть функция плотности вероятности)
#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;}
#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;}
Нужно просто произвести нормализацию. Пусть сгенерированный массив состоит из N случайных чисел из диапазона, скажем, [0,01;1]. Тогда находим сумму всех элементов массива и делим на неё каждый элемент массива. Тогда получится массив с единичной суммой...
Сергей Бережнов
если сумма массива будет сильно больше единицы и будут достаточно маленькие элементы, после нормализации они могут вылезти за нижнюю границу интервала
Похожие вопросы
- Дан массив из N элементов (N < 1000), причем N - четное. Вставить в середину массива сумму всех элементов.
- Вывести сумму тех элементов каждой строки, которые расположены правее максимального и левее минимального.
- Задание массива в С++ с переменным количеством элементов
- Составить программу. В одномерном массиве произвольных чисел вычислить произведения четных и нечетных элементов.
- С ++ Написать демонстрационную программу, в которой реализовать следующие действия:
- Дан целочисленный массив с количеством элементов п. Сжать массив, выбросив из него каждый второй элемент.
- Найти сумму нечетных элементов, стоящих на нечетных местах (то есть имеющих нечетные номера).
- Программа на С. Массивы
- Дана матрица nxn, вычислить суммы диагональных элементов( главной и побочной ) отдельно, но в одной функции на языке си.
- Напишите пожалуйста программу на СИ, массив стат или динам