问题是用户输入数字虽然与随机数匹配,但与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。 如果有增强的方法,可以随时对其进行修改。
答案 0 :(得分:2)
您的代码有几个问题。
首先,在generateLottery()
函数中生成随机数时,与generatemyLottery()
函数不同的是,您不能确保生成的数字是唯一的,在{function}函数中检查重复项并打印字符串{{1} }(如果找到)。也有一些代码可以更改"Invalid Format"
函数中的重复项,但是不能完全确保数字是唯一的。在某些输入中,这可能会导致您在生成的数字列表中包含重复的项目,并可能使您的点击数超出您的预期。
此外,generateLottery()
和matchMaker()
函数中还有超出范围的操作。具体来说,您有generateLottery()
循环从索引for
循环到索引1
,包括端点。由于您的数组大小为size
,因此访问或修改6
或myLotto[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);