중복 될 수 있습니다.
) "포함"입니다 :
count = end - begin + 1
당신은 당신이 수행 한 공 기반 count
요소를해야하는 경우 :
내가 겹쳐 번호를 방지 할 수있는 방법 또한
rand() % count + begin
: 시작 요소가 하지 0이 될 수 있기 때문에
rand() % count
, 당신은 실제로 범위의 값을 얻기 위해 다음을 수행 서로?
이 경우 더 쉬운 해결책 중 하나는 벡터를 사용하는 것입니다. 그것은 다른 답변 (@ Resired Ninja가 제안한 것과 같은)만큼 효율적이지 않지만 이해하기 쉽습니다. 아래에 표시된 것과 같습니다.
다음 코드는 셔플 결과를 덤프합니다 (사용 된 코드는 seed
에 따라 반복 실행되기 때문에 무작위가 아닙니다). 처음 5 가지 요소에 맞추기가 어렵지 않아야합니다 (모든 답을 줄 수는 없습니다).당신이 seed
(기본값은 0
이다), 당신은 얻을 것이다 다른 순서를 지정하는 경우
ShuffledRange range (1, 39);
...
$ ./tt.exe
29 33 8 37 9 32 38 24 16 14 36 7 10 31 34 39 27 11 6 4 35 1 19 20 18 15 5 12 22
21 3 30 17 25 2 28 23 26 13
는 :
는
ShuffledRange range (1, 39, 2);
...
$ ./tt.exe
12 20 28 6 7 15 32 17 35 11 18 31 27 4 23 36 25 24 22 1 33 2 37 39 21 9 38 13 5 3
14 10 8 34 16 19 29 26 30
아래 코드는 C++ (11) 때문에 random_shuffle
의 필요합니다.
$ g++ -Wall -Wextra -std=c++11 tt.cpp -o tt.exe
및 Mac OS X :
$ g++ -Wall -Wextra -std=c++11 -stdlib=libc++ tt.cpp -o tt.exe
class ShuffledRange
{
public:
explicit ShuffledRange(unsigned int low, unsigned int high, int seed=0)
: m_numbers(move(create_numbers(low,high,seed))), m_it(m_numbers.begin()) { }
unsigned int GetCount() const {
return static_cast<unsigned int>(m_numbers.size());
}
bool HasNext() const {
return m_it != m_numbers.end();
}
unsigned int GetNext()
{
if(!HasNext())
throw std::runtime_error("No numbers left");
unsigned int temp = *m_it++;
return temp;
}
protected:
vector<unsigned int> create_numbers(unsigned int low, unsigned int high, int seed)
{
if(high < low)
throw std::runtime_error("Bad range of elements");
vector<unsigned int> temp;
temp.reserve(high - low + 1);
for(unsigned int i = low; i <= high; i++)
temp.push_back(i);
srand(seed);
random_shuffle(temp.begin(), temp.end());
return temp;
}
private:
vector<unsigned int> m_numbers;
vector<unsigned int>::iterator m_it;
};
int main(int argc, char* argv[])
{
ShuffledRange range(1, 39);
while(range.HasNext())
cout << range.GetNext() << " ";
cout << endl;
return 0;
}
비주얼 스튜디오 2012 나 2010 년
GCC 필요한 비주얼 스튜디오에 대한 확실하지 않다 C++ (11)와 잘해야한다
힌트 ....
당신이
main
의 닫는 중괄호 (즉,
}
가), 당신은
system ("PAUSE");
필요하지 않습니다에 중단 점 (
F9)를 배치하면 17,451,515,
int main()
{
cout<<"Five random number is here"<<endl;
randnum();
system ("PAUSE");
return 0;
}
. Visual Studio가 중단되어 사용자를 기다립니다. 값을 검사했으면 F5을 눌러 프로그램을 마칩니다.
만약'C++ '를 사용한다면 표준 라이브러리를 사용하십시오. http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution을 참조하십시오. – imreal
1에서 39까지 5 개의 숫자를 선택하려면 벡터에 해당 숫자를 모두 추가하고 셔플 링 한 다음 첫 번째 5 번. –
그리고 그렇게하는 동안'std :: iota'와'std :: shuffle'을 염두에 두라. – chris