匹配两个数组的用户输入和随机数?

时间:2019-03-26 09:21:54

标签: c++

问题是用户输入数字虽然与随机数匹配,但与1个两位数中的单个数字匹配,例如:

用户输入6个数字:

1、2、3、4、5、6

随机生成的数字是:

48、3、24、4、16、1

匹配的总数为:4个数字。整数1、2和4匹配,但整数2与整数24匹配,为什么因为在24内有一个整数2,所以将其放入数组中,但仍匹配。有时我生成的随机数重复并且仍然运行。

我们的代码应该是彩票,您需要输入6个数字,然后生成6个其他随机数。这些必须显示从随机数到用户输入的匹配数。

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

const int size = 6;
const int lotteryDigits = 49;

void generateLottery (int lottoNumbers[])
{
srand(time(0));
for (int j = 0; j < size; j++)
  {
      int a = 1+(rand()% lotteryDigits);
      lottoNumbers[j] = a;
  }
  for (int i = 1; i <= size; i++)
  {
      for (int j = i; j <= size; j++)
        {
            if (lottoNumbers[i] == lottoNumbers[j])
            {
                lottoNumbers[j] = (rand() % 49 + 2)/ 2;
            }
        }
  }
}

void generatemyLottery (int myLotto[])
{
cout<<"Input your 6 Lucky numbers (1-49)"<<endl;
    for (int i = 0; i < size; i++)
{
    cin>>myLotto[i];
}

for (int i = 0; i < size; i++)
{
    for (int j = i+1; j < size; j++)
    {
        if (myLotto[i] == myLotto[j] || myLotto[i] > 49 || myLotto[i] < 1)
        {
            cout<<"\nInvalid Input"<<endl;
        }
    }
}
}

void matchMaker (int lottoNumbers[], int myLotto[], int hits)
{
  for (int i = 1; i <= size; i++)
  {
      for (int j = 1; j <= size; j++)
      {
          if (myLotto[i] == lottoNumbers[j])
          {
              hits++;
          }
      }
  }
}

void displayNumbers (int lottoNumbers[], int myLotto[], int hits, char 
yesOrno)
{
cout<<"Do you want to Draw (Y/N): ";
cin>>yesOrno;

if (yesOrno == 'Y' || yesOrno == 'y')
{
    if (hits > 1 && hits < 1)
    {
        cout<<"You hit "<<hits<<" numbers"<<endl;
    }
    else if (hits == 1 || hits == 0)
    {
        cout<<"You hit "<<hits<<" number"<<endl;
        cout<<"\nBetter Luck next time";
    }
    else if (hits == 6)
    {
        cout<<"You got the JACKPOT";
    }
cout<<"\nYour numbers are"<<endl;
    for (int i = 0; i < size; i++)
    {
        if (myLotto[i] <= lotteryDigits && myLotto[i]>=1)
        {
              cout<<myLotto[i]<<" ";
        }
    }
    cout<<"\nWinning number are"<<endl;
    for (int i=0; i < size; i++)
    {
        cout<<lottoNumbers[i]<<" ";
    }
    cout<<endl;
}
    if (yesOrno == 'N' || yesOrno == 'n')
{
    cout<<"\nPlease come again"<<endl;
}
}

int main()
{
int lottoNumbers[6];
int myLotto[6];
char yesOrno;
int choice;
int hits = 0;

while (true)
{
    cout<<"LOTTO\n\n\n";
    cout<<"1. Enter a Number\n";
    cout<<"2. Draw the Numbers\n";
    cout<<"2. Exit\n\n";
    cout<<"Choice: ";
    cin>>choice;

if(choice == 1)
{
    system ("CLS");
    generateLottery (lottoNumbers);
    generatemyLottery (myLotto);
    system ("PAUSE");
    system ("CLS");
}
else if(choice == 2)
{
    system ("CLS");
    matchMaker (lottoNumbers, myLotto, hits);
    displayNumbers (lottoNumbers, myLotto, hits, yesOrno);
    system ("PAUSE");
    system ("CLS");
}
else if(choice == 3)
{
    return 0;
}
else if(choice > 3 || choice < 1 )
{
    system ("CLS");
    cout<<"Invalid Input\n\n";
    system ("PAUSE");
    system ("CLS");
}
else{
    cout<<" \nInvalid Input";
    system ("CLS");
}
}
}

结果应该是

用户输入6个数字:

1、2、3、4、5、6

随机生成的数字是:

48、3、24、4、16、1

假定的匹配号码只能是3。 如果有增强的方法,可以随时对其进行修改。

3 个答案:

答案 0 :(得分:2)

您的代码有几个问题。

首先,在generateLottery()函数中生成随机数时,与generatemyLottery()函数不同的是,您不能确保生成的数字是唯一的,在{function}函数中检查重复项并打印字符串{{1} }(如果找到)。也有一些代码可以更改"Invalid Format"函数中的重复项,但是不能完全确保数字是唯一的。在某些输入中,这可能会导致您在生成的数字列表中包含重复的项目,并可能使您的点击数超出您的预期。

此外,generateLottery()matchMaker()函数中还有超出范围的操作。具体来说,您有generateLottery()循环从索引for循环到索引1,包括端点。由于您的数组大小为size,因此访问或修改6myLotto[size]的操作将访问您不应访问的位置。您可能正在写或读取数组边界之外的值,该值恰好等于用户输入的整数之一,从而错误地增加了命中次数。

答案 1 :(得分:0)

您的媒人有多个问题。首先,您从索引1开始,而不是索引0。其次,您还看到自己超出了数组的长度。我认为这可能是一个原因。

void matchMaker (int lottoNumbers[], int myLotto[], int hits)
{
  for (int i = 0; i < size; i++)
  {
      for (int j = 0; j < size; j++)
      {
          if (myLotto[i] == lottoNumbers[j])
          {
              hits++;
          }
      }
  }
}

答案 2 :(得分:0)

此if中的陈述始终为假。

if (hits > 1 && hits < 1)
        {
            cout << "You hit " << hits << " numbers" << endl;
        }

仅当将其用于displayNumbers()时,命中仅是主程序中变量的副本。不保存来自功能matchMaker的命中值。 您应该返回点击值或传递指针。

int matchMaker(int lottoNumbers[], int myLotto[])
{
    int hits = 0;
    for (int i = 0; i < lottoSize; i++)
    {
        for (int j = 0; j < lottoSize; j++)
        {
            if (myLotto[i] == lottoNumbers[j])
            {
                hits++;
            }
        }
    }
    return hits;
}
...
hits = matchMaker(lottoNumbers, myLotto);