#c #arrays
#c #массивы
Вопрос:
Я должен извлечь 3 шара из урны из 24 и сложить общую скидку, которую представляют шары. Мне не разрешено заменять шары после рисования, поэтому не может быть нарисовано дубликатов шаров. Скидки 1, 2, 3, 4, 5, 6, 7, 8, и есть по 3 штуки каждого из них.
Мое решение этой проблемы заключалось в создании нескольких циклов while, которые разворачиваются из 24 и повторяются до тех пор, пока не будут отрисованы дубликаты. В прошлом я выполнял подобный цикл, который перебирал случайные числа до тех пор, пока не было выбрано не повторяющееся, и оно работало нормально, поэтому я настроил эту программу таким же образом.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int draw(int urn[], int draws[]);
int main()
{
int discountSum,discount;
int urn[24]={1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8};
int draws[1000]={0};
draw(urn,draws);
cin >> discount;
int averageDiscount=discount/1000;
return 0;
}
int draw(int urn[], int draws[])
{
static int discountSum=0;
int i; //simulations counter
int ball1, ball2, ball3;
int score1, score2, score3;
int totalDiscount;
srand(time(0));
for(i=0;i<1000;i )
{
ball1=rand()%24;
while (ball2==ball1)
{
ball2=rand()%24;
}
while ((ball3==ball2)||(ball3==ball1))
{
ball3=rand()%24;
}
score1=urn[ball1];
score2=urn[ball2];
score3=urn[ball3];
totalDiscount=score1 score2 score3;
draws[i]=totalDiscount;
cout << "1) " << draws[i] << " percent discount.n";
discountSum =totalDiscount;
}
return discountSum;
}
Когда я запускаю этот код, вместо получения ошибки программа запускается без вывода и возвращает отрицательное мусорное значение вместо 0. Я хотел бы видеть вывод от каждой скидки до 1000-го цикла.
Комментарии:
1. Могут быть дополнительные ошибки. Например, draw() возвращает значение (
discountSum
), но это значение ничему не присваивается. Вы имели в виду что-то вродеint discount = draw(urn,draws);
?2. Вероятно, более простое решение — создать
std::vector
orstd::array
с 24 элементами от 0 до 23, случайным образом перетасовать его, а затем получить первые 3 значения Смstd::iota
. Иstd::shuffle
Примеры на cppreference.com
Ответ №1:
Похоже, что ошибка заключается в том, что ball2
и ball3
сравниваются, прежде чем они когда-либо будут установлены на что-либо. Они даже не инициализируются, что является вероятной причиной вашего «мусорного значения». Вероятно, это сработает, если вы «нарисуете» каждый шар перед его сравнением, как:
ball1=rand()%24;
ball2=rand()%24;
while (ball2==ball1)
{
ball2=rand()%24;
}
ball3=rand()%24;
while ((ball3==ball2)||(ball3==ball1))
{
ball3=rand()%24;
}
Еще лучшим способом было бы использовать do
… while
вместо этого циклы, которые всегда выполняются один раз, как:
ball1=rand()%24;
do
{
ball2=rand()%24;
} while (ball2==ball1);
do
{
ball3=rand()%24;
} while ((ball3==ball2)||(ball3==ball1));
Комментарии:
1. Это было именно так! Не могу поверить, что я пропустил что-то подобное. Спасибо!
Ответ №2:
Гораздо более простой способ сделать это — использовать средства, встроенные в стандартную библиотеку C :
#include <iostream>
#include <algorithm>
#include <random>
std::mt19937 gen(std::random_device{}()); // initialize random number generator
/*
* or
std::mt19937 gen(std::time(NULL));
* if std::random_device is not well-implemented
*/
int draw()
{
static int urn[24]={1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8};
std::shuffle(std::begin(urn), std::end(urn), gen); // shuffle array
return urn [0] urn[1] urn[2]; // pick first three balls from array
}
int main()
{
int discount = draw();
// Use discount. For example,
std::cout << discount;
return 0;
}
Документация: