彩票应用,代码问题

时间:2012-02-01 15:20:08

标签: c++ sorting

我正处于IT的第一年和第二学期:程序员分析师,我在使用我的代码时遇到了一些问题,想出了一个彩票应用程序。

我所要做的就是在1-49之间随机输出3行7个数字,然后输出6个数字作为“标签”,我对“标签”部分没有任何问题因为有标签你不需要按顺序排列数字,你可以有0,你也可以有重复的数字。

但是乐透最大部分各有3行7个数字,它们需要从左到右依次排序,完全随机,也没有0。

到目前为止,这是我的代码,虽然我认为它是随机的而没有0,但它的工作原理却没有对数字进行排序。

代码:

//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 :(得分:0)

在1到49之间创建21个随机数:

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

然后你订购数字:

Quicksort(randomNumbers, 0, 20);

最后你按照自己想要的方式打印它们。

您可以在wikipedia找到quicksort c ++代码。无论如何,这是:

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);
     }  
}

答案 1 :(得分:0)

就像乐透机一样。将1-49中的所有数字加载到列表/数组中。使用rand()创建索引0-48,从该索引处的列表中获取数字,并将其替换为“0”以标记它已被绘制。重复,(忽略任何'0'被检索),直到绘制了21个数字。排序

答案 2 :(得分:0)

当其他人打败我时,我会补充一点,使用已经提供的算法通常比从头开始执行更好。此外,如果要对它们进行排序,则必须将随机数存储在某处。在这种情况下,我使用了已经提供的向量类。另外我相信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;
    }
}

答案 3 :(得分:0)

你可以这样做:

  1. 构建一个包含49个数字的数组
  2. 随机播放阵列
  3. 对前7个数字进行排序,打印
  4. 对接下来的7个数字进行排序,打印出来
  5. 继续重复步骤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;
        }
    }
    

答案 4 :(得分:-1)

好的,首先看看循环,主要是 for 循环。它应该用于生成随机数。例如,要使用1到49之间的6个随机数填充数组,您可以使用:

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

在你的问题中,你说数字必须是完全随机的,但我觉得你暗示数字在数组中必须是唯一的。如果是这种情况,您应该在再次添加之前检查数组中是否已存在每个数字。您可以使用set结构执行此操作,但为简单起见,您可以使用以下内容:

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/

这应该足以让你入门。 祝你好运:)