#include<iostream>
#include<array>
#include<list>
#include<random>
using namespace std;
bool test1(default_random_engine& urng) {
uniform_int_distribution dist(0, 2);
array<int, 3> situ{ 0,0,0 };
int car = dist(urng);
situ[car] = 1;
int select = dist(urng);
return situ[select] == 1;
}
bool test2(default_random_engine& urng) {
uniform_int_distribution dist(0, 2);
list<int> situ{ 0,0,0 };
int car = dist(urng);
int ind = 0;
for (auto& i : situ)
{
if (ind == car)
i = 1;
++ind;
}
uniform_int_distribution dist2(0, 1);
int del = dist2(urng);
list<int>::iterator it = situ.begin();
for (int i = 0; i < 3; ++i) {
if (*it == 0) {
if (del == 0) {
situ.erase(it);
break;
}
--del;
}
++it;
}
int select = dist2(urng);
it = situ.begin();
while (select--)
++it;
return *it == 1;
}
bool test3(default_random_engine& urng) {
uniform_int_distribution dist(0, 2);
list<int> situ{ 0,0,0 };
int car = dist(urng);
int ind = 0;
for (auto& i : situ)
{
if (ind == car)
i = 1;
++ind;
}
int select1 = dist(urng);
uniform_int_distribution dist2(0, 1);
int del = dist2(urng);
list<int>::iterator it = situ.begin();
for (int i = 0; i < 3; ++i) {
if (*it == 0) {
if (i != select1) {
if (del <= 0) {
del = i;
break;
}
--del;
}
else --del;
}
++it;
}
int select2 = 0;
for (int i = 0; i < 3; ++i) {
if (i != select1 && i != del) {
select2 = i;
break;
}
}
it = situ.begin();
while (select2--)
++it;
return *it == 1;
}
int main() {
random_device rd;
mt19937 urng(rd());
for (int j = 0; j < 3; ++j) {
int count = 0;
for (int i = 0; i < 10000; ++i) {
count += test1(urng);
}
cout << count << endl;
}
cout << endl;
for (int j = 0; j < 3; ++j) {
int count = 0;
for (int i = 0; i < 10000; ++i) {
count += test2(urng);
}
cout << count << endl;
}
cout << endl;
for (int j = 0; j < 3; ++j) {
int count = 0;
for (int i = 0; i < 10000; ++i) {
count += test3(urng);
}
cout << count << endl;
}
cout << endl;
}
三扇门中有一扇是正确的,选择一个门后,排除一个错误的,再更换成另一扇门。
最后选择正确的概率大于50%!!
也就是说多对多错选一的情况下,排除了错的,会减小换了后错的可能性;排除了对的,会减小换了后对的可能性。

comment 评论区
star_outline 咱快来抢个沙发吧!