Я написал простой фрагмент кода для сравнения разности случайных массивов и нашел что-то... что я не совсем понимаю.
Я ожидал, что результат будет случайным числом, близким к 0,5, но на практике это 0,3333.
Почему массив случайных чисел соответствует 0,3, а не 0,5?
const result = document.getElementById('result');
const generateRandomNrArray = (nrNumbers) => {
let i;
let result = [];
for (i = 0; i < nrNumbers; i++) {
result.push(Math.random());
}
return result;
}
const getArrayDiff = (arr1, arr2) => {
var diff = 0;
arr1.forEach(function (v1, index) {
diff += Math.abs(v1 - arr2[index]);
});
return diff;
}
const run = (nr) => {
const arr1 = generateRandomNrArray(nr);
const arr2 = generateRandomNrArray(nr);
const totalDiff = getArrayDiff(arr1, arr2);
result.innerHTML = "Average difference:" + (totalDiff / nr);
}button {font-size: 2em;}<div id = "result"></div>
<button id = "run" onclick = "run(1500)">Click Me</button>Попробуйте еще раз с тремя числами и посмотрите, каково ваше среднее значение. Вы можете увидеть образец
Средняя разница, наверное, стремится к 0. Вы говорите об абсолютной разнице.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это в основном сводится к пределу, и это имеет смысл. Рассмотрите комбинации чисел от 0 до 10 и сосчитайте различные различия, которые вы можете сделать.
Например, есть одна комбинация с разницей 9 — (0, 9). Их 5 с разницей в 5:
[0, 5],
[1, 6],
[2, 7],
[3, 8],
[4, 9]
Но есть девять комбинаций с разницей в 1:
[1, 2],
[2, 3],
...
[8, 9]
От 0 до 10 счетчики:
{1: 9, 2: 8, 3: 7, 4: 6, 5: 5, 6: 4, 7: 3, 8: 2, 9: 1}
Есть 45 комбинаций, и средняя разница этих комбинаций 3.6666 не 5, потому что меньших различий больше, чем больших.
При увеличении степени детализации от 0–10 до 0–100 сохраняется тот же шаблон. Есть 99 комбинаций, которые приводят к разнице 1, и только 50 с разницей 50 для среднего значения 33.6666.
По мере того, как вы увеличиваете количество значащих цифр в противоположных направлениях в противоположном направлении с более тонким делением между 0 и 1, вы обнаруживаете тот же процесс, что и предел приближается 1/3. Существует гораздо больше меньших различий, чем больших, которые тянут среднюю разницу вниз. Для 0-1 с интервалом 0,1 вы увидите 9 с разницей 0,1 и 5 с разницей 0,5, при 0,01 будет 99 с разницей 0,01 и 50 с разницей 0,5. По мере приближения интервала к 0 среднее значение разностей приближается к 1/3.
Да, проблему становится легче понять с фиксированными большими числами вместо маленьких гранулированных чисел 0.xxxx. «...потому что меньших различий больше, чем больших». Это хороший момент, но он вызывает несколько вопросов. Почему тогда среднее число не становится еще меньше? Например, 0,25. Сначала у меня было внутреннее чувство, что число в конечном итоге будет Math.PI по какой-то волшебной математической причине.
@RainerPlumer Когда вы случайным образом делите интервал на две части, средний размер двух частей составляет 1/2. Если вы выбираете два числа случайным образом, вы разбиваете интервал на 3 части, и средний размер каждой части равен 1/3. Тогда средняя разница между двумя числами равна 1/3.
@Sulthan: ваш комментарий четче и лаконичнее, чем любой ответ здесь. Это был бы хороший ответ сам по себе.
с подходом с дискретными переменными
разделить интервал [0;1] на N элементов (соотв. k=1 на N, X примет значение k/N). Позже мы заставим N стремиться к бесконечности.
Для заданного X_k (где X содержит значение k/N) вычислите среднее расстояние, заданное формулой
avgDistance(k) = sum_{i=1}^k (k-i)/N P(Y=i) + sum_{i=k+1}^n (i-k)/N P(Y=i)
первый член, когда y < x, второй член, когда x < y
первый член суммирует расстояние между 0 и k, поэтому 1/N(k(k+1)/2), а второй член суммирует расстояние между 1 и N-k, поэтому 1/N(N-k)(N-k+1).
Более того, P(Y=i) = 1/N для всех i (поскольку Y распределено равномерно)
таким образом
avgDistance(k) = 1/N^2 [ k(k+1)/2 + (N-k)(N-k+1)/2 ] = 1/(2N^2) [ 2k^2 + N^2 - 2kN + N ]
Ну наконец то
avgDistance = sum_{k=1}^N avgDistance(k) P(X=k) = 1/N sum_{k=1}^N avgDistance(k) = 1/(2N^3) sum [ 2k^2 + N^2 - 2kN + N ]
Идея состоит в том, чтобы упростить сумму типа aN^3 + ... слагаемых меньше, чем N^3, поэтому, когда N стремится к бесконечности, мы просто получим aN^3/(2N^3) + что-то, что стремится к 0
sum 2k^2 = 2(N(N+1)(2N+1))/6 ~ 4N^3/6
sum N^2 = N^3
sum -2kN = -2N(N(N+1)/2 ~= -N^3
Таким образом a = 4/6 и avgDistance = 1/3
Вот геометрический аргумент, демонстрирующий, почему результат сходится к 1/3.
Во-первых, давайте определим f(x, y) = abs(x - y). Нам нужно доказать, что для X и Y — двух независимых случайных величин с равномерным распределением в [0, 1] E(X, Y) = 1/3.
Если мы визуализируем функцию f в трехмерном пространстве как поле высот над квадратом [0, 1] x [0, 1], объем под f состоит из двух тетраэдров, основание которых представляет собой полуединичный квадрат, а высота равна единица высоты.
E(X, Y) — объем под f. По формуле объема пирамиды каждый из двух тетраэдров имеет объем a*h/3, где a — площадь основания, а h — высота. Это означает, что каждый тетраэдр имеет объем 1/2 * 1 * 1/3 = 1/6, и, следовательно, E(X, Y) = 2 * 1/6 = 1/3.
(На самом деле вы смотрите не на различия, а на абсолютные различия между вашими случайными числами. Разница есть. (Простите за каламбур.))
Если у вас есть две независимые равномерно распределенные случайные величины X, Y ~ U[0,1], то их абсолютная разность |X-Y| будет соответствовать треугольное распределение с математическим ожиданием 1/3. Все так, как должно быть. Этот результат распределения, а также вычисление математического ожидания — довольно стандартная домашняя задача в теории вероятностей. Интуиция следует непосредственно за Аргумент Марка.
Вот гистограммы абсолютных и неабсолютных разностей. Слева вы видите, что масса больше для меньших абсолютных разностей, что снижает математическое ожидание.
R-код:
set.seed(1)
xx <- runif (1e5)
yy <- runif (1e5)
par(mfrow=c(1,2))
hist(abs(xx-yy),main = "|X-Y|",col = "grey",xlab = "")
hist(xx-yy,main = "X-Y",col = "grey",xlab = "")
(Кстати, наш дочерний сайт Перекрестная проверка — замечательный ресурс, если у вас есть вопрос о вероятности/статистике.)
Есть простой естественный способ взглянуть на это:
Если у вас есть интервал, скажем, <0.0, 1.0>, и вы случайно выбираете число из интервала, вы, по сути, разделите интервал на две части <0.0, x> и <x, 1.0>.
Средний размер каждой части (по многим случайным числам) будет сходиться к 0.5.
Теперь, если вы выберете два случайных числа из интервала, вы разделите интервал на три части <0.0, x>, <x, y> и <y, 1.0> (x < y). Если вы подсчитаете средний размер каждой части по множеству случайных чисел, он сойдется к 1/3.
Средняя разница между двумя числами и есть средний размер детали.
(первоначально комментарий)
Java, похоже, тоже дает результат. Может быть, это поможет объяснить такое поведение? math.stackexchange.com/questions/637822/…