Смотрю, многих сводит с ума и лишает скрепов т.н. неравенство Белла. Уже говорят и об отмене локальной природы реальности и о нарушении принципа причинности... В общем, немного покумекал и за 15 минут с пивом нашел ошибку учёных.
Вот статья, где все переведено на программерский язык C#. Так нашему брату будет легче всего понять:
https://habr.com/post/181692/ А то, понимаш, любят усложнять.
Получается вот какая хрень. У долбанной частицы есть 3 некие величины, каждую из которых можно измерить (только одну). Назовем A, B и C. По результатам измерения получаем либо 0 либо 1. Так. А запутанная частица этот же параметр (у каждой из частиц нужно замерять одинаковый параметр, к примеру и там и там A) будет иметь противоположное значение, т.е. 1 или 0. Это четко совпадает.
Фигня получается в случае, когда сравниваем параметры случайным образом, к примеру у первой выбираем A, а в второй (спутанной с ней) выбираем B (или A и A — тут как попадешь, без исключений). Типа должно получаться 0,6(6) а с какого то хрена получается меньше (близко к 0.5). Ну и сразу начали воду мутить о нелокальной природе реальности и прочей хрени.
А я сразу понял в чем фишка. Просто природа исключает случаи, когда все 3 значения полностью одинаковы. Т.е. убираем вариант 000 и 111. И тогда, как раз, получаем значение близкое к 0.5, но чуть больше. Кста, можно даже определить прав ли я, посмотрев на результаты измерений (сходу не нашел). Если чуть больше 0.5 — значит прав.
Вот новая версия проги, которая демонстрирует мою идею и объясняет ошибку учёных:
https://dotnetfiddle.net/Q334ok
| Скрытый текст |
| using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication14
{
class Program
{
static void Main(string[] args)
{
int confirm = 0, notconfirm = 0;
Random rnd = new Random();
List<Tuple<bool, bool, bool>> p = new List<Tuple<bool, bool, bool>>();
for (int i = 0; i < 500000; i++)
{
//var t = new Tuple<bool, bool, bool>(rnd.Next(2) == 1 ? true : false, rnd.Next(2) == 1 ? true : false, rnd.Next(2) == 1 ? true : false);
//p.Add(t);
var t1 = new Tuple<bool, bool, bool>(false, false, true);
var t2 = new Tuple<bool, bool, bool>(false, true, false);
var t3 = new Tuple<bool, bool, bool>(false, true, true);
var t4 = new Tuple<bool, bool, bool>(true, false, false);
var t5 = new Tuple<bool, bool, bool>(true, false, true);
var t6 = new Tuple<bool, bool, bool>(true, true, false);
switch (rnd.Next(6))
{
case 0:
p.Add(t1);
break;
case 1:
p.Add(t2);
break;
case 2:
p.Add(t3);
break;
case 3:
p.Add(t4);
break;
case 4:
p.Add(t5);
break;
case 5:
p.Add(t6);
break;
default:
throw new Exception("second error");
}
}
for (int i = 0; i < 500000; i++)
{
var t = p[i];
bool first, second;
switch (rnd.Next(3))
{
case 0:
first = t.Item1;
break;
case 1:
first = t.Item2;
break;
case 2:
first = t.Item3;
break;
default:
throw new Exception("first error");
}
switch (rnd.Next(3))
{
case 0:
second = !t.Item1;
break;
case 1:
second = !t.Item2;
break;
case 2:
second = !t.Item3;
break;
default:
throw new Exception("second error");
}
if (first != second)
confirm++;
else
notconfirm++;
}
Console.WriteLine((double)confirm / (double)(confirm + notconfirm));
Console.ReadKey();
}
}
}
|
| |