Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 25.12.2020, 12:29
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

В посте #2 этого топика максимально простое и очевидное решение. Я правильно понимаю, что далее дискуссия ведется по поводу строки 11, из-за которой это решение теоретически может работать бесконечно долго?
Ответить с цитированием
  #22 (permalink)  
Старый 25.12.2020, 14:08
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Alexandroppolus,
дискуссии не было, полностью согласен что #2 простое решение и чем больше начальный массив, тем меньше "лишних" циклов вероятность, мне было интересно решить это как-то иначе.
Ответить с цитированием
  #23 (permalink)  
Старый 25.12.2020, 14:39
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Я покрутил алгоритм из поста #2 со множеством из 20 элементов 1 000 000 раз.
Получил 2 лишних цикла.
Как и положено по теории, с вероятностью 1/2^20 получаем последовательность из 20 случайных чисел, каждое из которых < 0.5 или >=0.5
Годный датчик случайных чисел
Ответить с цитированием
  #24 (permalink)  
Старый 25.12.2020, 14:53
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

чисто ради прикола докрутил #2, чтобы не было вероятности лишнего цикла

function splitSet(set) {
    const subs = [[], []];
    for(let i = 0; i < set.length; i++) {
        subs[Math.round(Math.random())].push(set[i]);
    }
    if (!subs[0].length || !subs[1].length) {
        const srcIndex = subs[0].length ? 0 : 1;
        const index = Math.floor(Math.random() * set.length);
        subs[1 - srcIndex] = subs[srcIndex].splice(index, 1);
    }
    return subs;
}

for (let i = 0; i < 25; i++) {
    let [s1, s2] = splitSet([1,2,3,4,5,6,7]);
    console.log(s1, s2);
}


суть: если в одном из массивов пусто, из другого перекидываем случайно выбранный элемент. Это сохраняет равные шансы для каждого из элементов попасть в любой массив.

Можно было бы перекидывать, допустим, первый элемент. Но тогда немного уменьшились бы его шансы оказаться вместе со вторым, хотя по отдельности и у первого, и у второго одинаковые шансы быть в любом из массивов. Этот "парадокс" я пока не осмыслил.
Ответить с цитированием
  #25 (permalink)  
Старый 25.12.2020, 17:11
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Alexandroppolus
если в одном из массивов пусто, из другого перекидываем случайно выбранный элемент. Это сохраняет равные шансы для каждого из элементов попасть в любой массив.
сейчас подумал - а ведь этот вариант не совсем правильный, он немного увеличивает шансы для разбиений, где отдельно один элемент.
Да, задачка хитрая)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выбор случайного количества элементов из множества Black_Star jQuery 6 23.10.2016 21:00
случайное число в span ultrahomie Общие вопросы Javascript 2 16.04.2016 14:29
Случайное число при перезагрузке страницы logi Общие вопросы Javascript 8 21.10.2011 15:47
Вывести случайное число от 1 до 20 beliykot Events/DOM/Window 12 29.08.2011 13:22
Случайное число в цикле sanhai Events/DOM/Window 15 11.04.2010 06:12