From 91527e416a282aaa3872e7cdc6235cd1fb545a25 Mon Sep 17 00:00:00 2001 From: Benjamin Kraft Date: Thu, 30 Jun 2022 18:45:33 +0200 Subject: [PATCH] 100 prisoners --- CMakeLists.txt | 6 ++++++ main.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..79dc9bd --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.22) +project(100_Prisoners) + +set(CMAKE_CXX_STANDARD 23) + +add_executable(100_Prisoners main.cpp) diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..c0229ec --- /dev/null +++ b/main.cpp @@ -0,0 +1,47 @@ +#include +#include +#include + +using std::cout, std::endl; + +int main() { + const int PRISONER_COUNT = 100; + const int N = 1000000; + + + std::random_device rd; + std::default_random_engine rng(rd()); + + std::vector numbers; + for (int i = 0; i < PRISONER_COUNT; i++) + numbers.push_back(i); + + auto runExperiment = [](const std::vector &numbers){ + for (int j = 0; j < PRISONER_COUNT; j++){ + int nextBox = j; + bool success = false; + for (int i = 0; i < PRISONER_COUNT / 2; i++){ + nextBox = numbers[nextBox]; + if (nextBox == j){ + + if (i == PRISONER_COUNT / 2 - 1) + return true; + + success = true; + break; + } + } + if (!success) return false; + } + return true; + }; + + int success = 0; + for (int i = 0; i < N; i++){ + std::shuffle(numbers.begin(), numbers.end(), rng); + if (runExperiment(numbers)) success++; + } + cout << double(success) / N << endl; + + return 0; +}