Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <random>
- #include <chrono>
- using namespace std;
- const int I = 5, J = 8, K = 7;
- mt19937 gen;
- const int CNT_TRIES = 1000000;
- const int CNT_STEPS = 1000;
- int getRandom(int mx) {
- return gen() % mx;
- }
- enum State{
- Left,
- Right,
- Both,
- River,
- Spears
- };
- State makeMoveLeft() {
- if (getRandom(I + J) < J)
- return State::Both;
- else
- return State::River;
- }
- State makeMoveRight() {
- if (getRandom(J + K) < J)
- return State::Both;
- else
- return State::Spears;
- }
- State makeMoveBoth() {
- int res = getRandom(I + J + K);
- if (res < I)
- return State::Left;
- else if (res < I + J)
- return State::Both;
- else
- return State::Right;
- }
- State makeMove(State current) {
- switch (current) {
- case State::Left:
- return makeMoveLeft();
- case State::Right:
- return makeMoveRight();
- case State::Both:
- return makeMoveBoth();
- case State::River:
- return State::River;
- case State::Spears:
- return State::Spears;
- }
- }
- State makeTry() {
- State current = State::Left;
- for (int i = 0; i < CNT_STEPS && current != State::River && current != State::Spears; i++)
- current = makeMove(current);
- return current;
- }
- void makeTries() {
- int river = 0, spears = 0, other = 0;
- for (int i = 0; i < CNT_TRIES; i++) {
- State current = makeTry();
- if (current == State::River)
- river++;
- else if (current == State::Spears)
- spears++;
- else
- other++;
- }
- printf("River: %d\nSpears: %d\nOther: %d\n", river, spears, other);
- printf("Probability of falling into the river: %f\nProbability of falling into spears: %f\n", river * 1.0 / CNT_TRIES, spears * 1.0 / CNT_TRIES);
- }
- int main()
- {
- gen.seed(time(0));
- makeTries();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment