I am creating a lottery game in C++. I created a function called GetLottoPicks which asks the user for 7 numbers. I have another function called GenWinNums that generates 7 random numbers.
The problem is for the GenWinNums it keeps generating this 7 times: -858993460
I believe I made inputs into the argument int WinningNums[] bu apparently not?
Thank you.
int main()
{
string name;
int choice;
int user_picked[7];
int chosen_lotto[7];
cout << "LITTLETON CITY LOTTO MODEL:" << endl;
cout << "---------------------------" << endl;
cout << " 1) Play Lotto " << endl;
cout << " Q) Quit Program " << endl;
cout << " Please make a selection: ";
cin >> choice;
if (choice == 1)
{
cout << "\n Please enter your name: ";
cin >> name;
getLottoPicks(user_picked);
GenWinNums(chosen_lotto);
for(int i = 0; i < 7; i++)
{
cout << chosen_lotto[i];
}
for(int i = 0; i < 7; i++)
{
cout << user_picked[i];
}
}
else if (choice == 'Q' || 'q')
{
exit(0);
}
else
{
cout << "That is not a valid choice." << endl;
}
system("PAUSE");
return 0;
}
int getLottoPicks(int UserTicket[])
{
const int amount = 7;
UserTicket[amount];
int ticket = UserTicket[amount];
for (int i = 0; i < amount; i++)
{
cout << "\n Please enter number " << i + 1 << ":";
cin >> UserTicket[i];
while (UserTicket[i] < 1 || UserTicket[i] > 40)
{
cout << "Your selection cannot be less than 1 and/or greater than 40. Try Again." << endl;
cin >> UserTicket[i];
}
if(i > 0)
{
for(int check = 0; check < i; check++)
{
while(UserTicket[i] == UserTicket[check])
{
cout << "You cannot use the same lotto number twice. Try again: " << endl;
cin >> UserTicket[i];
}
}
}
}
return ticket;
}
int GenWinNums(int WinningNums[])
{
const int amount = 7;
int numbers[amount];
int ticket = WinningNums[amount];
for(int i = 0; i < amount; i++)
{
numbers[i] = (rand() % 40) + 1;
while(numbers[i] < 1 || numbers[i] > 40)
{
numbers[i] = (rand() % 10) + 1;
}
if(i > 0)
{
for(int check = 0; check < i; check++)
{
while(numbers[i] == numbers[check])
{
numbers[i] = (rand() % 10) + 1;
}
}
}
}
return ticket;
}
Just for fun, here's a fairly big number of fixes. I'm not going to enumerate them all. basically:
char
for the input type (so Q
would ever get matched) and prefer aa switch over repeated ifs Exercise for the reader: seed your rand()
generator , or it was pretty simple to win this lottery (pasting in the previous winning ticket :))
Output on a demo run (shows error handling as well):
LITTLETON CITY LOTTO MODEL:
---------------------------
1) Play Lotto
Q) Quit Program
Please make a selection: 1
Please enter your name: me
Please enter number 1:34
Please enter number 2:7
Please enter number 3:16
Please enter number 4:18
Please enter number 5:24
Please enter number 6:24
Duplicate entry 24
Please enter number 6:7
Duplicate entry 7
Please enter number 6:37
Please enter number 7:whoops
Bad input 'whoops' discarded
Please enter number 7:what was the last number again?
Bad input 'what' discarded
Please enter number 7:Bad input 'was' discarded
Please enter number 7:Bad input 'the' discarded
Please enter number 7:Bad input 'last' discarded
Please enter number 7:Bad input 'number' discarded
Please enter number 7:Bad input 'again?' discarded
Please enter number 7:27
User ticket: 7; 16; 18; 24; 27; 34; 37;
Winning ticket: 7; 16; 18; 24; 27; 34; 36;
Result of draw: WINNER
.
#include <string>
#include <iostream>
const size_t amount = 7;
void getLottoPicks(int (&ticket)[amount])
{
for(int i = 0; i < amount; i++)
{
do
{
std::cout << "\n Please enter number " << i + 1 << ":";
if(std::cin >> ticket[i])
{
if(ticket[i] >= 1 && ticket[i] <= 40)
{
bool ok = true;
for(int check = 0; ok && check < i; check++)
{
ok &= (ticket[i] != ticket[check]);
}
if(ok)
{
break;
}
else
{
std::cout << "You cannot use the same lotto number twice. Try again." << std::endl;
}
}
else
{
std::cout << "Your selection cannot be less than 1 and/or greater than 40. Try Again." << std::endl;
}
}
else
{
std::cin.clear();
std::string discard;
std::cin >> discard;
std::cout << "Bad input '" << discard << "' discarded";
}
}
while(true);
}
}
void GenWinNums(int (&winningNumbers)[amount])
{
for(int i = 0; i < amount; i++)
{
winningNumbers[i] = (rand() % 40) + 1;
while(winningNumbers[i] < 1 || winningNumbers[i] > 40)
{
winningNumbers[i] = (rand() % 10) + 1;
}
if(i > 0)
{
for(int check = 0; check < i; check++)
{
while(winningNumbers[i] == winningNumbers[check])
{
winningNumbers[i] = (rand() % 10) + 1;
}
}
}
}
}
int main()
{
std::string name;
char choice;
std::cout << "LITTLETON CITY LOTTO MODEL:" << std::endl;
std::cout << "---------------------------" << std::endl;
std::cout << " 1) Play Lotto " << std::endl;
std::cout << " Q) Quit Program " << std::endl;
std::cout << " Please make a selection: ";
std::cin >> choice;
switch(choice)
{
case '1':
{
std::cout << "\n Please enter your name: ";
std::cin >> name;
int user_picked[amount];
int chosen_lotto[amount];
getLottoPicks(user_picked);
GenWinNums(chosen_lotto);
std::cout << "\n";
for(int i = 0; i < amount; i++)
{
std::cout << user_picked[i] << "; ";
}
std::cout << "\n";
for(int i = 0; i < amount; i++)
{
std::cout << chosen_lotto[i] << "; ";
}
}
case 'Q':
case 'q':
return 0;
default:
std::cout << "\n That is not a valid choice." << std::endl;
}
std::cout << "\n Press enter...";
std::cin >> choice;
}
#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <set>
const size_t amount = 7;
typedef std::set<int> ticket_t;
ticket_t getLottoPicks()
{
ticket_t ticket;
while (ticket.size() < amount)
{
std::cout << "\n Please enter number " << (ticket.size()+1) << ":";
int entry;
if(std::cin >> entry)
{
if(entry >= 1 && entry <= 40)
{
if (ticket.end() != ticket.find(entry))
std::cout << "Duplicate entry " << entry;
else
ticket.insert(entry);
} else
std::cout << "Entry out of range [1..40]: " << entry;
continue;
}
std::cin.clear();
std::string discard;
std::cin >> discard;
std::cout << "Bad input '" << discard << "' discarded";
}
return ticket;
}
ticket_t genWinNums()
{
ticket_t ticket;
while (ticket.size() < amount)
ticket.insert(rand() % 40 + 1);
return ticket;
}
std::ostream& operator<<(std::ostream& os, ticket_t const& t)
{
std::copy(t.begin(), t.end(), std::ostream_iterator<int>(os, "; "));
return os;
}
int main()
{
std::cout << "LITTLETON CITY LOTTO MODEL:" << std::endl;
std::cout << "---------------------------" << std::endl;
std::cout << " 1) Play Lotto " << std::endl;
std::cout << " Q) Quit Program " << std::endl;
std::cout << "Please make a selection: ";
char choice;
std::cin >> choice;
switch(choice)
{
case '1':
{
std::cout << "\n Please enter your name: ";
std::string name;
std::cin >> name;
const ticket_t user = getLottoPicks();
const ticket_t winning = genWinNums();
std::cout << "User ticket: " << user << "\n";
std::cout << "Winning ticket: " << winning << "\n";
// check win?
bool ok = 0 == std::lexicographical_compare(
user.begin(), user.end(),
winning.begin(), winning.end());
std::cout << "Result of draw: " << (ok? "WINNER":"No luck") << "\n";
}
case 'Q': case 'q':
return 0;
default:
std::cout << "\n That is not a valid choice." << std::endl;
}
std::cin.ignore(1<<24,'\n');
std::cout << "\n Press enter...";
std::string dummy;
std::getline(std::cin, dummy);
}
Looks like you are never assigning any values to the WinningNums
array in your routine, that might explain why you get the same number all the time.
I'd suggest removing the numbers
array and working directly with WinningNums
to generate your random numbers.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.