Приложение лотереи, проблема с кодом - PullRequest
1 голос
/ 01 февраля 2012

У меня первый год и второй срок работы в IT: программист, аналитик, и у меня возникли некоторые проблемы с моим кодом, чтобы найти приложение для лотереи.

Все, что мне нужно сделать, это вывести 3 строки по 7 чисел для лото-макс случайным образом между 1-49, а затем вывести 6 чисел для «тега», у меня нет проблем с частью «тега» потому что с тэгом вам не нужно иметь номера в порядке, и вы можете иметь 0, а также вы можете иметь дубликаты номеров.

Но для части lotto max с 3 рядами по 7 чисел в каждой они должны располагаться в порядке сборки слева направо и абсолютно произвольно, также без нулей.

Вот мой код, который работает, но не упорядочивает числа, хотя я думаю, что это случайный код без нулей.

код:

//Lotto.cpp
#include <iostream> // input out put stream
#include <time.h> //randomizer 
using namespace std; //prevents redundancy

void main() //main returns nothing
{
    srand((unsigned int)time(0)); //random uses time for this function

    while(true) // while its true; repeats upon enter key
    {
        //randomizes any 7 numbers between 1 and 50 and outputs all seven in three separate rows
        cout << "\n               **********Zachattack's Lotto Experience**********" << "\n                                 Good Luck!!!" << endl;
        cout << "\n                             " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1;
        cout << "\n                             " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1;
        cout << "\n                             " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << endl;

        //randomizes 6 different numbers between 0 and 9 for the Tag
        cout << "\n                            ***In the Bag Tag!***             \n\n                                    " << rand() % 10 << rand() % 10 << rand() % 10 << rand() % 10 << rand() % 10 << rand() % 10 << endl;

        system("pause>nul");
    }
}

Ответы [ 5 ]

0 голосов
/ 01 февраля 2012

Вы можете сделать это так:

  1. Построить массив из 49 чисел
  2. Перемешать массив
  3. Сортировка первых 7 чисел, печать их
  4. Сортировка следующих 7 чисел, печать их

Продолжайте повторять шаг 4. столько строк, сколько вам нужно (не более 7 ;-)). Вот пример кода, который реализует эту стратегию. Проверка на наличие дубликатов не требуется.

#include <algorithm>
#include <iostream>
#include <vector>

#include <cstdlib>
#include <ctime>

// This function is courtesy of http://benpfaff.org/writings/clc/shuffle.html
void shuffle(int *array, size_t n)
{
    if (n > 1) {
        size_t i;
        for (i = 0; i < n - 1; i++) {
            size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
            int t = array[j];
            array[j] = array[i];
            array[i] = t;
        }
    }
}

int main()
{
    srand( time( NULL ) );

    std::vector<int> numbers( 49 );
    for ( int i = 0; i < numbers.size(); ++i )
        numbers[i] = i + 1;

    shuffle( &numbers[0], numbers.size() );

    std::vector<int>::iterator rowIt = numbers.begin();
    for ( int i = 0; i < 3; ++i ) {
        std::vector<int>::iterator rowEnd = rowIt + 7;
        std::sort( rowIt, rowEnd );

        std::cout << "Row " << i << ":";
        while ( rowIt != rowEnd )
            std::cout << " " << *rowIt++;
        std::cout << std::endl;
    }
}
0 голосов
/ 01 февраля 2012

Поскольку другие люди побеждают меня в ответ, я просто добавлю, что использование уже предоставленных алгоритмов обычно лучше, чем реализация с нуля. Кроме того, вы должны где-то хранить случайные числа, если вы собираетесь их отсортировать. В этом случае я использовал уже предоставленный векторный класс. Кроме того, я верю, что в C ++ вы должны использовать заголовок ctime, а не time.h, хотя я считаю, что это действительно одно и то же.

#include <iostream>
#include <ctime>
#include <algorithm>
#include <vector>

using namespace std;

int main()  {
   //set up the lottery parameters
   const int GROUPS = 3;
   const int NUMBERS_PER_TICKET = 7;

   //seed the random generator
   srand((unsigned int)time(0));

   //declare the datastructure for holding the numbers
   std::vector<int> numbers[GROUPS];

/* fill our three 7 number groups
   by generating them */
for (int j = 0; j < GROUPS; ++j) {
   for (int i = 0; i < NUMBERS_PER_TICKET; ++i) {
       numbers[j].push_back((rand() % 49) + 1);
   }
}

//now sort them using the built-in sort algorithm
for (int i = 0; i < GROUPS; ++i) {
    std::sort(numbers[i].begin(), numbers[i].end());
}

    //now print in order by line
    for (int j = 0; j < GROUPS; ++j) {
       std::cout<<"Line: " << j + 1 << " :";
       for (int i = 0; i < NUMBERS_PER_TICKET; i++) {
          std::cout<< " " << numbers[j].at(i);
       }
       std::cout<<std::endl;
    }
}
0 голосов
/ 01 февраля 2012

Хорошо, сначала взглянем на циклы, в основном цикл для . Он должен использоваться для генерации случайных чисел. Например, чтобы заполнить массив 6 случайными числами от 1 до 49, вы можете использовать:

int i, numbers[6];
for ( i = 0; i < 6; i++ ) {
   numbers[ i ] = 1 + rand()%49
}

В своем вопросе вы говорите, что числа должны быть абсолютно случайными, но я чувствую, что вы подразумеваете, что числа должны быть уникальными в массиве. Если это так, вы должны проверить, существует ли каждое число в массиве, прежде чем добавлять его снова. Вы можете сделать это с помощью заданной структуры, но для простоты вы можете использовать что-то вроде:

int i, j, num, duplicates, numbers[6];
for ( i = 0; i < 6; i++ ) {   
   do { 
       num = 1 + rand()%49;
       duplicates = 0;
       for ( j = 0; j < i; j++ ) {
           if ( numbers[ j ] == num ) duplicates = 1;
       }
   } while (duplicates);
   numbers[ i ] = num;
}

Если у вас есть числа в массиве, вы можете их отсортировать. Вы можете использовать qsort:

http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/

Этого должно быть достаточно, чтобы вы начали. Удачи:)

0 голосов
/ 01 февраля 2012

Делай так, как это делает лото-машина. Загрузите все цифры от 1 до 49 в список / массив. Используйте rand () для создания индекса 0-48, получите число из списка по этому индексу и замените его на '0', чтобы отметить, что оно было нарисовано. Повторяйте (игнорируя любые '0', которые были извлечены), пока не будет нарисовано 21 число. Сортировка.

0 голосов
/ 01 февраля 2012

Создайте 21 случайное число от 1 до 49:

int randomNumbers[21];
for(int i = 0; i < 21; i++)
    randomNumbers[i] = rand() % 49 + 1;

Тогда вы заказываете номера:

Quicksort(randomNumbers, 0, 20);

И, наконец, вы печатаете их так, как хотите.

Вы можете найти код быстрой сортировки c ++ в wikipedia . Вот оно, во всяком случае:

int colocar(int *v, int b, int t)
{
    int i;
    int pivote, valor_pivote;
    int temp;

    pivote = b;
    valor_pivote = v[pivote];
    for (i=b+1; i<=t; i++){
        if (v[i] < valor_pivote){
                 pivote++;    
                temp=v[i];
                v[i]=v[pivote];
                v[pivote]=temp;

        }
    }
    temp=v[b];
    v[b]=v[pivote];
    v[pivote]=temp;
    return pivote;
} 

void Quicksort(int* v, int b, int t)
{
     int pivote;
     if(b < t){
        pivote=colocar(v, b, t);
        Quicksort(v, b, pivote-1);
        Quicksort(v, pivote+1, t);
     }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...