Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый Сегодня, 06:32
Аватар для BlancoDima
Интересующийся
Отправить личное сообщение для BlancoDima Посмотреть профиль Найти все сообщения от BlancoDima
 
Регистрация: 29.07.2014
Сообщений: 15

Random разница плоского и вложенного массива
Приветствую, товарищи, особенно тех приветствую, кто нормально учился, в отличие от меня. Я совершенно не понимаю статистику, помогите понять, буду ли я одинаково получать случайные значения, если буду получать их из плоского массива или вложенного.

Вот пример:
var arr_1 = ['a', 'b', 1, 2, 3];
var arr_2 = [['a', 'b'], 1, 2, 3];

// Для плоского
var value_1 = arr_1.randomValue();

// Для вложенного
var value_2 = arr_2.randomValue();
if(value_2.length) {
    value_2 = value_2.randomValue();
}

Будет ли значение 'a', в обоих случаях появляться с одинаковым шансом, или придётся сначала разворачивать массив?

p.s. метод randomValue я добавил к массиву и для простаты указываю его.
Ответить с цитированием
  #2 (permalink)  
Старый Сегодня, 08:42
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,235

Сообщение от BlancoDima
Будет ли значение 'a', в обоих случаях появляться с одинаковым шансом, или придётся сначала разворачивать массив?
Самый простой ответ - написать тест и запустить его.
Потом посмотреть результат.
Ответить с цитированием
  #3 (permalink)  
Старый Сегодня, 09:00
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,235

В первом варианте у меня выпадало чаще...

const arr = [
	['a', 'b', 1, 2, 3],
	[['a', 'b'], 1, 2, 3]
];
const n = 1000000
let t = performance.now()
arr.forEach((a, i) => {
	console.log('Вариант %s.', i + 1)
	let cnt = 0
	for (let i = 0; i < n; i++){
		let v = rnd(a)
		if (Array.isArray(v)) v = rnd(v)
		if (v === 'a') cnt++
	}
	const p = 100 / n * cnt
	console.log('Вероятность %s% ', p)
})
t = Math.floor(performance.now() - t)
console.log('Время затрачено %sмлс', t)
//
function rnd(a){
	if (!a.length) return null
	const i = Math.floor(Math.random() * a.length)
	return a[i]
}
Ответить с цитированием
  #4 (permalink)  
Старый Сегодня, 10:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,134

BlancoDima,
в идеальном случае 1 вариант 100/5 = 20%, 20% что выпадет a.
2 вариант для a будет 100/4/2 = 12.5%.
вариант ksa, наглядно это подтверждает.
Ответить с цитированием
  #5 (permalink)  
Старый Сегодня, 16:18
Аватар для BlancoDima
Интересующийся
Отправить личное сообщение для BlancoDima Посмотреть профиль Найти все сообщения от BlancoDima
 
Регистрация: 29.07.2014
Сообщений: 15

Понял наконец как считать, моя интуиция тут пасовала.

Спасибо!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
script fingerprint ALL небольшая модификация Chris_Phils Ваши сайты и скрипты 3 21.02.2017 09:50