#include <string> #include <iostream> #include <fstream> #include <random> #include <algorithm> using namespace std; unsigned long make_int(int size) { random_device rd; unsigned long mi = rd() + rd(); vector<unsigned short> arroverlap, arrtemp; for (; mi; mi /= 10) arroverlap.push_back(mi % 10); arroverlap.erase(remove_if(arroverlap.begin(), arroverlap.end(), [&arrtemp](unsigned short x)->bool{ for (auto temp : arrtemp) if (temp == x) return true; arrtemp.push_back(x); return false;})); if(arrtemp.size() >= size) { unsigned long ret = 0; for (auto tmp : arroverlap) if (!size--) return ret; else ret *= 10, ret += tmp; } return 0; } int main() { int length; cout << "숫자야구 (테스트)" << endl; RE_SET: cout << "숫자길이 : "; cin >> length; if(length > 8) { cerr << "숫자길이를 8이하로 설정하십시오." << endl; goto RE_SET; } else if(length < 1) { cerr << "숫자길이를 1이상으로 설정하십시오." << endl; goto RE_SET; } unsigned long real; for (; !(real = make_int(length));) ; cout << real << endl; unsigned long save; int sido=0; for(;;){ cout << endl << "예측한 숫자 : "; cin >> save; if (real == save) break; int ball=0, strike=0; for (int i=0, rmp=real, smp=save; smp && rmp; smp /= 10, rmp /= 10,i++) for (int tmp = real, j=0; tmp; tmp /= 10,j++) if(smp % 10 == tmp % 10) { if (i == j) strike++; else ball++; break; } if(ball) cout << "볼 : " << ball << "개" << endl; if(strike) cout << "스크라이크 : " << strike << "개" << endl; if (!ball && !strike) cout << "아웃!" << endl; sido++; } cout << "게임이 끝났습니다."; cout << "시도횟수 : " << sido; return 0;

}


make_int는 중복없이 랜덤 숫자 만드는 건데


이거 쓰면 몇 십배는 빠를 거임

bool배열 이용한 것


#include <random> #include <cmath> class NonOverlappedRandomNumberGenerator { public: typedef unsigned long long rand_type; NonOverlappedRandomNumberGenerator( rand_type lvalue, rand_type rvalue ) { unsigned long long size = rvalue - lvalue + 1; std::random_device rd; std::mt19937_64 rnd(rd()); std::vector<bool> _overlap_check(size); for (rand_type i = 0; i < size; i++) { do { rand_type real = rnd() % size + lvalue; if (!_overlap_check[real - lvalue]) { m_vec.push_back(real); _overlap_check[real - lvalue] = true; break; } } while (true); } } rand_type operator[](rand_type index) const { return m_vec[index]; } rand_type* ToArray() { rand_type *array = new rand_type[m_vec.size()]; for (rand_type i = 0; i < m_vec.size(); i++) array[i] = m_vec[i]; return array; } rand_type size() const { return m_vec.size(); } private: std::vector<rand_type> m_vec; };

포팅은 알아서 하세요