Вопрос о JavaScript Math.random () и базовой логике - PullRequest
32 голосов
/ 02 июня 2019

Я написал простой фрагмент кода для сравнения случайных различий в массивах и нашел что-то ... чего я не совсем понимаю.

  1. Я генерирую 2 массива, заполненных случайными числами
  2. Суммируйте различия между случайными числами
  3. Распечатайте среднюю разницу

Я бы ожидал, что результатом будет случайное число, близкое к 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>

Ответы [ 5 ]

29 голосов
/ 02 июня 2019

Это в основном сводится к пределу, и это имеет смысл.Рассмотрим комбинации чисел от 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.

22 голосов
/ 03 июня 2019

(На самом деле, вы смотрите не на различия , а на абсолютные различия между вашими случайными числами. Есть разница. (Простите за каламбур. ))

Если у вас есть две независимые равномерно распределенные случайные величины X, Y ~ U[0,1], то их абсолютная разница |X-Y| будет следовать за треугольным распределением с ожиданием 1/3. Все как и должно быть. Этот результат распределения, так же как и вычисление ожидания, является довольно стандартной проблемой домашнего задания в теории вероятностей. Интуиция непосредственно следует за аргументом Марка .

Вот гистограммы абсолютных и не абсолютных различий. Слева вы видите, как больше массы для меньших абсолютных разностей, что снижает ожидания.

triangles

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="")

(Кстати, наш родственный сайт CrossValidated - замечательный ресурс, если у вас есть вопрос о вероятности / статистике.)

4 голосов
/ 03 июня 2019

Вот геометрический аргумент, демонстрирующий, почему результат сходится к 1 / 3.

Сначала давайте определим f (x, y) = abs (x - y).Нам нужно доказать, что для X и Y две независимые случайные величины с равномерным распределением в [0, 1], E (X, Y) = 1/3.

Если мы визуализируем функцию fв 3D как поле высоты над квадратом [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.

3 голосов
/ 03 июня 2019

Существует простой естественный способ взглянуть на это:

Если у вас есть интервал, скажем <0.0, 1.0>, и вы случайным образом выберете число из интервала, вы по существу разделите интервал на две части.<0.0, x> и <x, 1.0>.Средний размер каждой части (по множеству случайных чисел) будет сходиться к 0.5.

Теперь, если вы выберете два случайных числа из интервала, вы разделите интервал на три части <0.0, x>, <x, y> и <y, 1.0> (x < y).Если вы вычислите средний размер каждой части по множеству случайных чисел, она будет сходиться к 1/3.

Средняя разница между этими двумя числами равна среднему размеру детали.

(оригинальный комментарий)

1 голос
/ 02 июня 2019

с приближением к дискретной переменной

делить интервал [0; 1] на N элементов (соответственно k = 1 до N, X будет принимать значение k/N).Позже мы сделаем N стремящимся к infty

. Для заданного 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

первый член суммирует расстояние между 0 и k, таким образом, 1/N(k(k+1)/2), а второй член суммирует расстояние между 1 и Nk, таким образом, 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 стремится к infty, мы просто получим N ^ 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

...