Нет вывода из цикла массива

#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 or std::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;
}
  

Документация:

std::mt19937

std::random_device

std::shuffle