# Random World ```cpp= /** * 10000명의 사람, 2500개의 일이 있고, 일에 대한 능력치는 수치화 시킬 수 있으며 다른 사람과 겹치지 않는다. * 10000명의 사람은 각기 다른 능력치를 “랜덤”으로 부여 받으며, “랜덤”으로 1 ~ 50명을 알고지내는지 정해진다. * 이 경우 명제가 성립할 확률은 몇 % 인가? */ #include <iostream> #include <vector> #include <cstdlib> #include <ctime> #include <algorithm> #include <random> #define N 10000 #define M 2500 #define F_MAX 50 using namespace std; class Person { public: int friends; // 알고 지내는 사람 수 short *frineds_list; // 알고 지내는 사람들 리스트 Person() { this->friends = rand() % 50 + 1; this->frineds_list = (short *) calloc(this->friends, sizeof(short)); } }; int main() { // random seed 초기화 srand((unsigned int)time(NULL)); // 능력치 설정 - stats[i] 는 i번째 사람의 0~2499번째 능력치 vector<vector<short> > stats(N, vector<short>(M, 0)); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { stats[i][j] = j; } random_shuffle(stats[i].begin(), stats[i].end()); } // 친구 설정 vector<short> friends_id(N, 0); for (int i = 0; i < N; i++) { friends_id[i] = i; } // 10000명에 대하여 능력치와 알고 지내는 사람 수 세팅 (월드 생성) vector<Person> people(N); for (int i = 0; i < N; i++) { Person p; people[i] = p; random_shuffle(friends_id.begin(), friends_id.end()); for (int j = 0; j < p.friends; j++) { p.frineds_list[j] = friends_id[j]; } } // 확률 계산 int learn_something_from_everybody = 0; for (int i = 0; i < N; i++) { int me = i; int learn_count = 0; int friends_number = people[i].friends; for (int j = 0; j < friends_number; j++) { int my_friend = people[i].frineds_list[j]; bool can_learn_something = false; for (int k = 0; k < M; k++) { if (stats[my_friend][k] > stats[me][k]) { can_learn_something = true; break; } } if (can_learn_something) { learn_count ++; } } if (learn_count == friends_number) learn_something_from_everybody++; } cout << (double) learn_something_from_everybody / N << endl; } ```