読者です 読者をやめる 読者になる 読者になる

問: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