Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.12.2020, 16:02
Новичок на форуме
Отправить личное сообщение для LimonDK Посмотреть профиль Найти все сообщения от LimonDK
 
Регистрация: 14.12.2020
Сообщений: 3

Рандом с вероятносью, хелп пж
Допустим есть функцию randomChanses(map)
Т.е. на входе у нас словарь, в котором ключ-символ, а значение-вероятность появление этого символа. Т.е. допустим есть такой набор:
{'a'=10,'b'=20,'c'=30}. Т.е. появление a 1к10, b 1к20, с 1к30. Помогите накидать функцию, которое бы возвращала рандомное значение, учитываю вероятность. Была идея просто создать список, в который поместить 'a' 10 раз, 'b' 20 раз и т.д. Но это не совсем то, да и если шансы будут 1к1000, то слишком долго будет создаваться список.
Ответить с цитированием
  #2 (permalink)  
Старый 14.12.2020, 16:44
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от LimonDK
{'a'=10,'b'=20,'c'=30}
что означают эти числа?

Сообщение от LimonDK
функцию, которое бы возвращала рандомное значение
значения как должны выглядеть?

в общем, поподробнее бы условие.

Последний раз редактировалось Alexandroppolus, 14.12.2020 в 16:46.
Ответить с цитированием
  #3 (permalink)  
Старый 14.12.2020, 16:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,136

LimonDK,
const fun = n => n < 0.16 ? 'a' : n < .5 ? 'b' : 'c';
alert(fun(Math.random()));
Ответить с цитированием
  #4 (permalink)  
Старый 14.12.2020, 16:53
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,757

рони,
Сообщение от LimonDK
.е. появление a 1к10, b 1к20, с 1к30.
Как это понимать?
30 раз запустили.
В среднем должно быть 1 раз с, 1.5 раза b, 3 раза а. Разве не так?
Ответить с цитированием
  #5 (permalink)  
Старый 14.12.2020, 17:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,136

voraa,
Сообщение от LimonDK
Была идея просто создать список, в который поместить 'a' 10 раз, 'b' 20 раз и т.д
<script>
const fun = n => n < 0.16 ? 'a' : n < .5 ? 'b' : 'c';
const obj = {};
for (let i = 0; i < 60; i++) {
   let key = fun(Math.random());
   obj[key] = 1 + (obj[key] >> 0);
}
document.write(JSON.stringify(obj, "", 4))
  </script>

Последний раз редактировалось рони, 14.12.2020 в 17:23.
Ответить с цитированием
  #6 (permalink)  
Старый 14.12.2020, 17:20
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от LimonDK
Была идея просто создать список, в который поместить 'a' 10 раз, 'b' 20 раз и т.д.
кажется, понял.
потом из этого списка равновероятно выбираем элемент, и он оказывается одним из символов.
это как-раз то, что рони сделал. В общем виде примерно так:

function rnd(map) {
    const keys = Object.keys(map);
    if (!keys.length) {
        return undefined;
    }
    const sum = keys.reduce((s, key) => s + map[key], 0);
    const r = Math.random() * sum;
    let acc = 0;
    for (let i = 0; i < keys.length; ++i) {
        acc += map[keys[i]];
        if (acc > r) {
            return keys[i];
        }
    }
    return keys[keys.length - 1];
}

// для проверки рандомности
function getStat(map, iters) {
    const stat = Object.create(null);
    Object.keys(map).forEach(key => { stat[key] = 0; });
    for (let i = 0; i < iters; ++i) {
        const v = rnd(map);
        stat[v]++;
    }
    Object.keys(map).forEach(key => { stat[key] = stat[key] / iters; });
    return stat;
}

alert(JSON.stringify(getStat({'a': 10,'b': 20,'c': 30}, 40000), '', 4));
Ответить с цитированием
  #7 (permalink)  
Старый 14.12.2020, 17:37
Новичок на форуме
Отправить личное сообщение для LimonDK Посмотреть профиль Найти все сообщения от LimonDK
 
Регистрация: 14.12.2020
Сообщений: 3

Сообщение от voraa Посмотреть сообщение
рони,

Как это понимать?
30 раз запустили.
В среднем должно быть 1 раз с, 1.5 раза b, 3 раза а. Разве не так?
Вот такое хотелось сделать, только не особо понимаю, как каждый раз определять вероятности.
Ответить с цитированием
  #8 (permalink)  
Старый 14.12.2020, 18:23
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

то есть вероятности - это на самом деле обратные значения от тех, что в словаре?
гарантируется, что сумма этих обратных значений всегда не больше 1 ?
Ответить с цитированием
  #9 (permalink)  
Старый 14.12.2020, 18:40
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,136

Сообщение от LimonDK
Вот такое хотелось сделать, только не особо понимаю, как каждый раз определять вероятности.
a : 10, b : 20, с : 30
находим сумму всех весов 10 + 20 + 30 = 60//порядок не имеет значения
первый if 10 * 1/60
второй if (10 + 20) * 1/60
else всё остальное

итого
if(n < 0.16) return 'a';
else if(n < .5) return 'b';
else return 'c'

для примера другой порядок с : 30 , a : 10, b : 20
30 * 1/60
(30 + 10) * 1/60

if(n < .5) return 'c';
else if(n < .66) return 'a';
else return 'b'
Ответить с цитированием
  #10 (permalink)  
Старый 14.12.2020, 18:51
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,757

Тогда с таким же успехом можно было написать
{a:1, b: 2: c:3}
Никакой разницы.
Но между 1/2 и 1/20 для b все таки есть разница.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите убрать рандом bkmz_ha Javascript под браузер 3 30.03.2016 18:53
Хелп! Разделение аватар по гендерному признаку. Марго Мин Общие вопросы Javascript 0 15.01.2014 17:16
хелп ми друзья lepo Events/DOM/Window 3 24.12.2012 01:13
Выбор рандом значений с масива Beriagts jQuery 3 13.11.2012 17:24
В IE java Script Error! Хелп! web64 Общие вопросы Javascript 5 04.09.2008 17:09