問:0..n-1からm個の整数をランダムに選び出し、ランダムに出力するプログラムを作れ
ごり押し。長文。ださいorz
#include <iostream> #include <vector> using namespace std; const int n = 11; const int m = 10; vector<int> container; int rand_n(int n){ return rand() % n; } //重複true ノット重複false bool repetition_check(int i){ vector<int>::iterator it = container.begin(); for(; it != container.end(); it++){ if((*it) == i){//重複 return true; } } return false; } int main(){ //出力する乱数のリストを重複しないようにコンテナに詰める int i = m; while(i > 0){ int l = rand_n(n); if(repetition_check(l)){ continue; } container.push_back(l); i--; } //出力 vector<int>::iterator it = container.begin(); for(; it != container.end(); it++){ cout << *it << endl; } }
問2:さらに、結果をソートして、重複もありうるようなプログラムを作れ。
これは、先のコードにおいて
で実現できる。
#include <iostream> #include <set> using namespace std; const int n = 11; const int m = 10; multiset<int> container; int rand_n(int n){ return rand() % n; } int main(){ //出力する乱数のリストを重複しないようにコンテナに詰める int i = m; while(i > 0){ int l = rand_n(n); container.insert(l); i--; } //出力 multiset<int>::iterator it = container.begin(); for(; it != container.end(); it++){ cout << *it << endl; } }
出題元:珠玉のプログラミング 問題12.8