Найти тему
#ПрограммистТурист

Какова вероятность встретить идеального человека?

Мне приснился сон, что современные нейронные сети будут прогнозировать наше будущее и подбирать нам друзей и пару для создания семьи. Имея скромный опыт в программировании набросал небольшую модель примитивного подсчета вероятности встретить идеального человека.

Одиночество в толпе
Одиночество в толпе

Идея проста: Есть 100 людей, 100 тем для общения, у каждого от 1 до 100 вариантов ответа на вопрос. Итого 9900 возможных пар.

Обычное тестирование знакомое каждому со школы.

Нам нужно:

  1. Всех опросить и составить сводную таблицу
  2. Найти количество ПАР друзей у которых совпадут варианты ответов на одни и те же вопросы.
  3. Посчитать сколько пар будет иметь наибольшее количество совпадений

Результат работы этой модели заинтересовал

  • Всего 1% людей имеют несчастные 10% совпадения
  • Почти 33% обречены на одиночество в этой модели расчетов
  • Те же 33% будут с человеком с которым только 1 или 2 общие темы

Идеальных людей не бывает!!!

Привожу текст простого кода на PHP

И ссылку что бы протестировать его

PHP Sandbox - Execute PHP code online through your browser
Немного на непонятном языке
Немного на непонятном языке
$persons = 100; // количество людей
$questions = 100; // количество тем для общения
$coincidence = []; // массив совпадений
$best_friends = []; // лучшие друзья
$things_list = []; // список мыслей

// заполняем каждому человека значения на все вопросы. 100 человек, 100 вопросы
for ($p = 1; $p <= $persons; $p++) {
for ($t = 1; $t <= $questions; $t++) {
// генерируем случайный вариант
$rnd = rand(1, $questions);
$coincidence[$p][$t] = $rnd;
}
uasort($coincidence[$p], function ($a, $b) {
return strnatcmp($b, $a);
});
}

// перебираем всех людей
foreach ($coincidence as $person_name1 => $thought1) {
// перебираем их мысли
foreach ($thought1 as $thought1_name => $thought1_value) {
// сверяем мысли с другими участниками
foreach ($coincidence as $person_name2 => $thought_name2) {
// мы не можем быть парой самому себе
if ($person_name1 == $person_name2) {
continue;
}
// ключь массива - пара людей
$friend_key = $person_name1 . '_' . $person_name2;
if (!isset($best_friends[$friend_key])) {
$best_friends[$friend_key] = ['p1' => null, 'p2' => null, 'list' => []];
}
// если значение мысли совпали, записываем в друзья
if ($coincidence[$person_name2][$thought1_name] == $thought1_value) {
// счетчик мыслей
$things_list[$friend_key][$thought1_name] = $thought1_value;

$best_friends[$friend_key] = [
'p1' => $person_name1,
'p2' => $person_name2,
'list' => $things_list[$friend_key], // мысли которые совпали
];
}
}
}
}

// сортируем по кол-во совпавших мыслей
uasort($best_friends, function ($a, $b) {
return strnatcmp(count($b['list']), count($a['list']));
});

// сводная таблица лучших друзей
$table = [];
foreach ($best_friends as $friend) {
$c = count($friend['list']);
if (!isset($table[$c])) {
$table[$c] = 0;
}
$table[$c]++;
}

array_walk($table, function($friend_name, $coincidences){
echo 'Совпало ' . $coincidences . ' ответов у ' . $friend_name . ' пар' . PHP_EOL;
});

echo PHP_EOL;

// топ 10 пар
$best_friends = array_slice($best_friends, 0, 10);
echo 'Топ 10 пар' . PHP_EOL;
array_walk($best_friends, function($friend){
echo 'Человек ' . $friend['p1'] . '. Человек ' . $friend['p2'] . '. Совпало ответов ' . count($friend['list']). PHP_EOL;
array_walk($friend['list'], function($thought, $value){
echo 'Вопрос: ' . $thought . '. Общий ответ:' . $value. PHP_EOL;
});
echo PHP_EOL;
});

Пример расчетов
Пример расчетов

Вот такие странные идеи бывают в нашей профессии. :-)

Не верьте цифрам, верьте в любовь!
Не верьте цифрам, верьте в любовь!