Roman Prokopets, смотри, тебе надо найти случайное число в промежутке от 0 до 1 с вероятностью 0.333.
Как это сделать?
Делаем случайное число от 0 до 1:
x = random()*1.0
Получили число.
Вероятность того, что оно меньше 0.3333 как раз и есть эта вероятность.
Я не знаю как это описать более доступно.
Поэтому сравниваем x < 0.3333. если меньше, то наше вероятностное событие наступило
Klim Cheremnyh чувак, тебе тут люди отвечают, тратят своё время.
Ты уж будь благодарен. отмечай ответы. Не очень красиво с твоей стороны.
В следующий раз тебе помогать не будут
Северное Сияние, А чо сразу банк?
Банки - гниль ещё та. И работать там - зашквар.
Ты слышал про Basecamp? Не последняя компания, топчик от айти. Вот у них философия такая - брать людей только на удалёнку.
Даже книгу такую написали - "Remote". Невероятно известная книга в айти-сфере, но тебе она неведома, т.к. ты живёшь в каком-то своём коконе
xmoonlight, Возможно, я ступил и перепутал.
Тогда решается просто инвертированием вероятности: 1-P
Это не суть важно и на сам алгоритм никак не влияет.
Roman Prokopets, я бы рад кодом помочь, он тут не сильно сложны. В лямбдах это напишется в одну строку, но я так не умею.
Я напишу циклами, а в 2020-м это не очень модно, тем более, для JS
Пусть у нас массив из оценок [5, 5, 3, 2]
Сумма всех оценок S = 5+5+3+2 = 15
Вероятности выбора каждого элемента:
[5/15, 5/15, 3/15, 2/15] = [0.33333, 0.33333, 0.2, 0.133333], в сумме они дадут 1, как и должно быть.
1. Берём первый элемент с оценкой 5 и с вероятностью 0.3333 выбираем его: P = random()*1.0
Если P<0.333, то выбираем 1-й элемент и заканчиваем работу. Иначе идём дальше
2. Берём 2-й элемент с оценкой 5. Теперь у нас вероятность изменилась и мы её пересчитываем, чтобы в сумме была 1:
S = 5 + 3+ 2 = 10
Пересчитываем вероятности:
[5/10, 3/10, 2/10] = [0.5 ,0.3, 0.2] - в сумме опять 1, как и должно быть.
Теперь с вероятностью 0.5 определяем, берём ли мы 2-й элемент в качестве результата или нет: P = random()*1.0
Если P< 0.5, то заканчиваем работу. Иначе, идём дальше.
3. Пересчитываем общую сумму оценок: S = 3 + 2 = 5
Новые вероятности для оставшихся оценок: [3/5, 2/5] = [0.6, 0.4], в сумме опять 1
С вероятностью 0.6 определяем, оставляем ли 3-й элемент в качестве результата или нет.
Если нет, то дальше
4. Пересчитываем сумму оставшихся оценок: S = 2.
Новые вероятности для оставшихся оценок: [2/2] = [1].
То есть, со 100% вероятностью забираем последний элемент.
Но вот чтобы добраться до последнего элемента надо продраться через тернии более высоких оценок. Сложно, маловероятно, но в принципе это возможно.
UPD: Для оптимизации расчёта новой суммы S просто вычитаем из предыдущей S значение оценки i-го элемента. Сводим алгоритм к O(N)