Вводится начальное число. Вводится конечное число. Вводится количество просчетов. Программа выдает рандомное число от введенного начального до введенного конечного введенное количество раз. Т. е. вводишь числа от 5 до 8, например. И 100 раз (если ввели 100 в количестве просчетов) выявляется рандомное число, в каждом из которых либо 5, либо 6,7,8. Нужно узнать, сколько же из всех этих 100 чисел число, например, 5, показывается в этом списке. Так может быть, что число 5 из 100 последовательностей может быть 32, либо 18, ..Показать сколько процентов это число показалось от общей массы. И так с каждым числом (которое в заданном интервале) на новой строчке.
#include <iostream>
#include <conio.h>
#include <cstdlib>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
unsigned short int begin, finish, all, a = 0, x, c=0, i, v,g ;
cout << "Начальное число: ";
cin >> begin;
cout << "Конечное число: ";
cin >> finish;
cout << "Количество просчетов: ";
cin >> all;
i = 0;
v = 0;
for (v = begin; v <= finish; v++)
{
for (a = 1; a <= all; a++)
{
x = rand()%((finish+1)-begin)+begin; //рандомное число от begin до finish
if (v == x) c++;
}
cout << v << "(" << c << ")" << " = " << (double)c / all * 100 << " %\n";
}
c = 0;
}
_getch();
return 0;
}
Проблема в том, что при вводе чисел от 4 до 15 с количеством просчетов 1000 сумма чисел в скобках равна 983, а должна быть = 1000. Смотрите фото. Однако при вводе чисел от 4 до 8 с количеством просчетов 10 сумма в скобках равна количеству просчетов, т. е. 10. Где баг?

Нет бага, есть ошибка в рассуждениях. Ты генерируешь 12000 чисел от 4 до 15, считаешь, сколько раз 4 встречается среди первой 1000, сколько раз 5 встречается среди второй и т. д. А сумма будет равна 1000 только в среднем. Если нужно посчитать, сколько раз встречаются числа среди одного набора случайных - создай массив и записывай в него соответствующие значения.
Да, и переменные лучше объявлять в месте первого использования, чтобы путаницы не было.
#include <iostream>
#include <vector>
#include <random>
#include <iomanip>
using namespace std;
typedef unsigned short int ushort;
struct distribution {
ushort random_variable;
ushort luck;
};
int main() {
setlocale(2, "");
cout << " Начальное число: ";
ushort begin;
cin >> begin;
cout << " Конечное число: ";
ushort finish;
cin >> finish;
if (finish <= begin) exit(1);
cout << " Количество опытов: ";
ushort experiments;
cin >> experiments;
ushort interval = finish - begin + 1;
vector<distribution> statistics(interval);
for (ushort i = 0, b = begin; i < interval; ++i, ++b) statistics.at(i).random_variable = b;
uniform_int_distribution<ushort> rand(begin, finish);
random_device rnd;
for (ushort i = 0; i < experiments; ++i) for (ushort j = 0; j < interval; ++j) if (rand(rnd) == statistics.at(j).random_variable) ++statistics.at(j).luck;
for (ushort i = 0; i < interval; ++i) cout << setw(3) << statistics.at(i).random_variable << '(' << statistics.at(i).luck << ") = " << fixed << setprecision(2) << double(statistics.at(i).luck) / experiments * 100 << '\n';
cin.sync();
cin.get();
}
Н-да, если бы ты еще владел искусством внятного изложения задачи на русском языке. . Но, перечитав дважды, я понял :) Правда, не понял смысла "100 последовательностей". Так что сделал в одной :)
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main(){
int b,e,n,k; srand(time(NULL));
cout<<"b e n: "; cin>>b>>e>>n; cout<<endl; k=e-b+1;
int *a=new int[k]; for(int i=0;i<k;i++)a[i]=0;
for(int i=0;i<n;i++)a[rand()%k]++;
for(int i=0;i<k;i++)cout<<i+b<<"("<<a[i]<<") = "<<float(a[i])/n<<" %\n";
cin.get(); cin.get();}
Ну вначале по мелочи - вы забыли скобку (видимо когда копировали код) , также переменная g объявляется, но нигде не используется.
Теперь главное:
У вас вначале перебераются все числа от begin до finish (например от 4 до 15) и для каждого из этих чисел делается по all (например 1000) прогонов. Тоесть вначале 1000 раз получается случайное число и смотрится сколько раз это было 4, потом ещё 1000 раз получается случайное число и смотрится сколько раз это было 5 и т. д. Т. к. числа случайные вы каждый раз получаете новую последовательность чисел. В этом и состоит ваш баг.
Нужно ОДИН раз сгенерировать последовательность из 1000 чисел и там уже смотреть какое число сколько раз встречалось.
Сделать это можно разными способами. Самый простой - заносить сгенерированные числа в вектор, далее перебрать все его элементы и подсчитать сколько раз какой элемент встречался. Более сложный, но требующий меньше памяти и не хранящий сгенерированные числа - сделать вектор размером finish-begin и в нём хранить сколько раз встретилось какое число. Можно и ещё много чего придумать.
P.S. Как пример, немного переделанный ваш код:
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <vector>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
{
unsigned short int begin, finish, all;
cout << "Начальное число: ";
cin >> begin;
cout << "Конечное число: ";
cin >> finish;
cout << "Количество просчетов: ";
cin >> all;
vector<unsigned int> res(finish-begin+1);
for (int a = 1; a <= all; a++)
{
int x = rand()%((finish+1)-begin)+begin; //рандомное число от begin до finish
res[x-begin]++;
}
for (unsigned int i=0; i<res.size(); i++)
{
cout << i+begin << "(" << res[i] << ")" << " = " << (double)res[i] / all * 100 << " %\n";
}
}
_getch();
return 0;
}