[identity profile] newacct.livejournal.com posting in [community profile] useful_faq
У меня есть генератор случайных чисел, который генерирует случайное не целое число в диапазоне от 0 до 1 (Например, результат работы: 0,58). Используя результат работы такого генератора, мне нужно арифметическими действиями сделать генератор от 1 до 6 (только целые). Операцию округления я использовать могу.

Подскажите, пожалуйста.

Date: 2008-12-03 07:34 pm (UTC)
From: [identity profile] alex-rex.livejournal.com
А 6 условий?
от 0 до 0.1(6) = 1
от 0.1(6) до 0.(3) = 2 и т.д.

стоп, или чисто арифметика - плюс минус умножить?
Edited Date: 2008-12-03 07:35 pm (UTC)

Date: 2008-12-03 08:30 pm (UTC)
From: [identity profile] besisland.livejournal.com
А ежели генератор от 1 до 100 понадобится, будете сто условий писать?

Date: 2008-12-03 07:37 pm (UTC)
From: [identity profile] urvin.livejournal.com
int(rnd*5 + 1)

Date: 2008-12-03 07:51 pm (UTC)
From: [identity profile] poneslasj.livejournal.com
с учетом того что нужно получить равномерное распределение по 6 натуральным числам умножение на 5 сомнительно выглядит. доказать не могу голова уже не соображает но floor(rnd*6+1) выглядит честнее

Date: 2008-12-03 08:37 pm (UTC)
From: [identity profile] besisland.livejournal.com
Если int подразумевает округление к ближайшему целому, то вероятности будут распределены так:
1 — 10 %
2 — 20 %
3 — 20 %
4 — 20 %
5 — 20 %
6 — 10 %
Плохой способ.

я подозреваю

Date: 2008-12-04 07:17 am (UTC)
From: [identity profile] proxor.livejournal.com
int означает полное отбрасывание дробной части.

В этом случае

Date: 2008-12-04 07:31 am (UTC)
From: [identity profile] besisland.livejournal.com
1 — 20 %
2 — 20 %
3 — 20 %
4 — 20 %
5 — 20 %
6 — 0 %
Плохой способ.

Date: 2008-12-03 08:29 pm (UTC)
From: [identity profile] besisland.livejournal.com
Умножаете сгенерированное значение Rnd на 6 (количество нужных дискретных значений). Получаете дробное число 0 ≤ 6 ⋅ Rnd ≤ 6; вероятность выпадения ровно шести очень (теоретически бесконечно) мала, поэтому смело добавляем дополнительное условие: если Rnd равно 1,0, то результатом будет 6; в противном же случае считаем, что имеется дробное число 0 ≤ 6 * Rnd < 6. Округляем его в нижнюю сторону (floor), получаем целое число от 0 до 5 включительно. Для окончательного счастья прибавляем единицу.

Короче говоря, return (1.0 == (Rnd = Math.random())) ? 6 : (1 + Math.floor(6 * Rnd));

Re

Date: 2008-12-03 08:53 pm (UTC)
From: [identity profile] granite-golem.livejournal.com
Странно, обычно все генераторы ПСЧ дают число в полуинтервале [0; 1). Чем не устраивает классическая формула "floor(Math.random() * (b - a)) + a"?

Date: 2008-12-03 09:05 pm (UTC)
From: [identity profile] besisland.livejournal.com
Нужно умножать на (b - a + 1). (Потому что Math.random() * (b - a) даст число в полуинтервале [0; 5); floor даст целое от 0 до 4 включительно.)

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

Date: 2008-12-03 09:02 pm (UTC)
From: [identity profile] dmitriy-x84.livejournal.com
x - выход генератора
[y] - целая часть от y

тогда 1..6 получаем: v = [1 + x*6]

Date: 2008-12-03 09:36 pm (UTC)
From: [identity profile] doppeltes.livejournal.com
т.е. 0 и 1 выпасть не могут?

тогда задача не имеет точного решения