Имя: Пароль:
IT
 
Алгоритм управляемого рандома
,
0 1Сергей
 
29.04.19
10:08
Допустим, есть функция, которая генерирует случайное число, эмулируя бросание игральной кости

Функция Кость6(Удачливость=50)
    ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел();
    Возврат ГенераторСлучайныхЧисел.СлучайноеЧисло(1, 6);
КонецФункции


Как можно повлиять на "удачливость" результата? Скажем, при удачливости=50 необходимо чтобы вероятность выпадения всех чисел была одинаковой. При удачливости=0, выпадение единицы было 100%, остальных 0%. Ну, и при удачливости=100, то же самое для шестёрки.

Жду вариантов
1 Garykom
 
гуру
29.04.19
10:11
ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел(Ф(Удачливость));
2 RomanYS
 
29.04.19
10:12
(0) Задаешь интервалы для каждого значения, потом проверяешь на попадание в интервал
3 Генератор
 
29.04.19
10:12
если колво вариантов не очень большое, используй массив вариантов. Удачливые варианты добавляй в массив несколько раз, а потом выбирай из массива уже по обычному равномерному распределению
4 Garykom
 
гуру
29.04.19
10:12
Дарю.
Функцию Ф сам напишешь.
5 Garykom
 
гуру
29.04.19
10:12
(4) к (1)
6 Garykom
 
гуру
29.04.19
10:14
Интересно последовательности от одного начального числа на разных компах и платформах 1С разные?
7 1Сергей
 
29.04.19
10:15
(6) давай проверим
8 Garykom
 
гуру
29.04.19
10:15
ГенераторСлучайныхЧисел (RandomNumberGenerator)
Конструктор по умолчанию
Синтаксис:
Новый ГенераторСлучайныхЧисел(<НачальноеЧисло>)
Параметры:
<НачальноеЧисло> (необязательный)
Тип: Число.
Начальное число, которым инициализируется генератор случайных чисел.
Описание:
Генератор случайных чисел инициализируется начальным числом из параметра.
Последовательность случайных чисел для одного и того же начального числа будет одинакова.
9 1Сергей
 
29.04.19
10:23
(2) (3) ОК

и как задавать эти интервалы, массивы?
10 Генератор
 
29.04.19
10:29
>> При удачливости=0, выпадение единицы было 100%, остальных 0%.
Почему именно единицы? Противоположная сторона?
11 1Сергей
 
29.04.19
10:30
(10) ну, типа удача ноль - больше единицы не выпадет
Удача сто - только шестёрки выпадают
12 Mort
 
29.04.19
10:40
Результат = 6 - 5 * ГСЧ() * (1-Удача)
13 Mort
 
29.04.19
10:42
Не, децл не так.
14 ЛЮС
 
29.04.19
10:43
(11) а при 1 - что должно выпасть?
В целом подход такой: расширяешь диапазон генерации и начинаешь играться шириной интервалов: генеришь число 0-60, разбиваешь на диапазоны: 0-10 - единица и т.д. Это стандартное. 0-60 - единица - это удача = 0. А уж как разбивать будешь - твое дело.
15 1Сергей
 
29.04.19
10:46
(14) я понимаю, что в (0) не достаточно данных. Какая там кривая должна получиться - не понятно. Поэтому интересны все варианты
16 ЛЮС
 
29.04.19
10:57
(15) Если развить тему из (12) то можно получить такую бредятину:
Рез = ГСЧ()*У*(100-У)/2500 + 1*(100-У)*(50-У)/5000 + 6*У*(50-У)/(-5000)
Первое слагаемое - для 50, второе для 0, третье - для 100. Остальные варианты лень считать, возможно даже не укладывается в диапазон 1-6. Но этого в исходной постановке и не было.

А вообще тут не кривая распределения, а двумерная поверхность.
17 Mort
 
29.04.19
10:57
1 + 5 * (Удача) + (2.5 * (1 - ABS(2 * Удача - 1))) * ГСЧ(-1,1)
18 Mort
 
29.04.19
10:58
Нечто подобное делал недавно когда генерировал плавынй переход из одного шума Перлина в другой.
19 1Сергей
 
29.04.19
10:58
Получается, надо придумать функцию к таким данным:
http://pics.rsh.ru/img/temp_8yw39ynq.png
20 exwill
 
29.04.19
11:00
(0) Лучший способ влиять на удачливость в костях - это использовать сравнительно малоизвестный и контринтуитивный математический факт отсутствия транзитивности для вероятностей.
21 Кодер
 
29.04.19
11:00
Распиши, что должно получаться для двойки.
22 Mort
 
29.04.19
11:00
+(17)

При
Удача = 0, результат : 1
Удача = 1, результат : 6
Удача = 0.5, результат: 3.5 + 2.5 * ГСЧ(1, 1)

Промежуточные значения линейных образом, хотя это не указано в задаче.
23 Кирпич
 
29.04.19
11:08
(19) А в чем проблеме то?

Функция Кость6(Удачливость=50)
    Если Удачливость = 0 Тогда Возврат 1 КонецЕсли;
    Если Удачливость = 100 Тогда Возврат 6 КонецЕсли;
    ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел();
    Возврат ГенераторСлучайныхЧисел.СлучайноеЧисло(1, 6);
КонецФункции
24 Mort
 
29.04.19
11:10
(23) Удачливость может быть и 30%.
25 Кирпич
 
29.04.19
11:10
(24) в таблице нет про 30
26 Nikoss
 
29.04.19
11:16
(0) не честное онлайн казино на 1С пилишь чтоли?))
27 Mort
 
29.04.19
11:17
(17) Тоже неверно. По идее 60% удачливости должны давать чаще выпадение 6 чем 5, 5 чем 4 и т.д, а не больше шанса для 4 как стоящей на 60%.
28 Вафель
 
29.04.19
11:20
возьми отрезок поболее и нарежь его не ровно.
например 1 - 10 = 1, 10-80 = 2, 80-90 = 3 ...
29 RomanYS
 
29.04.19
11:28
(9) Вид коллекции непринципиален: массивы, структуры или ТЗ.
Не понятна суть проблемы (0)
математика? - это одно, нужны какие-то критерии;
техника реализации - интервалы и цикл проверки, здесь вроде проблем не видно.
30 1Сергей
 
29.04.19
11:31
(29) с учетом (15), просто интересно посмотреть на предложенные варианты. При которых удачливость более-менее равномерно размазывалась на шансы выпадения той или иной цифры
31 ЛЮС
 
29.04.19
11:36
Нда, математика страшная штука. Вон Mort сам с собой дискуссию ведет.
32 RomanYS
 
29.04.19
11:36
(30) Понятно. Всё-таки математика и никаких критериев))
Предложу свой критерий: матожидание результата должно равномерно изменяться от удачливости:
при 0% - матожидание 1
при 50% - 3.5
при 100% - 6
33 1Сергей
 
29.04.19
11:36
(31) он хоть что-то предложил
34 Nikoss
 
29.04.19
11:40
(0) при удачливости 10% может выпасть 6ка?
35 1Сергей
 
29.04.19
11:44
(34) не важно. Если можешь предложить вариант с ответом да или нет на этот вопрос, буду рад
36 Deon
 
29.04.19
13:30
(35) Я бы для понимабельности удачливость считал от -100 до +100.
Если удачливость 0, то вероятность выпадения 6 = 1/6 = 16.6%
Если удачливось +100, то вероятность выпадения 6 = 100%
Соответственно, между 0 и +100 вероятность выпадения 6-ки линейна.

Так при +10 вероятность уже 25%. На остальные 5 цифр остается 75%.
При выпадении этих 75%, они делятся по такому же принципу, как и с 6кой, но как-будто у нас кубик 5-сторонний
И уже при небольшой удаче +10 у меня получается округленное распределение вероятности такое:
1-10%, 2-12%, 3-15%, 4-18%, 5-21%, 6-25%
37 Вафель
 
29.04.19
13:38
(34) конечно может
38 Nikoss
 
29.04.19
13:39
(37) в скольки случаях из 1 000 000?
39 ЛЮС
 
29.04.19
13:47
(36) Зависимость не может быть линейной. На одном конце диапазона она 1, на другом 0, посередине 1/6. Эти три точки никак не дают линейную зависимость, в лучшем случае - комбинацию двух линейных с переломом
.
40 Deon
 
29.04.19
13:50
(39) Я потому и предлагаю удачу считать от -100 до +100, где в переломной точке 0 вероятность любого числа 1/6
Если удача отрицательна, то зависимость линейно тянет к выпадению единицы. Если положительна, то тянет к шестерке
41 Mort
 
29.04.19
14:02
Допустим удача у нас определяет линейную функцию вероятности y = kx.

Где (x) - это данные генератора случайных числе (0...1)

"у" это значение функции, который мы потом приведем к результатам костей следующим образом:

y < 16.7 это 1
y < 2*16.7  это 2 и т.д.

т.е. НомерГрани = Макс(y * 6, 6)

и (k) - коэффициент (наклон прямой) зависимый от удачи.

В случае удачи = 0.5 график выглядит y = х, т.е. k = 1.

В случае удачи = 0 график выглядит горизонтально как y = 0,

В случае удачи = 1 график вертикальный, y = бесконечность.

Отсюда k = удача/(1-удача)

Получаем: РезультатНомерГрани = Макс(6, удача/(1-удача) * 6 * ГСЧ(0,1))
42 Mort
 
29.04.19
14:03
*НомерГрани = МИН(y * 6, 6) Минимум конечно
43 Mort
 
29.04.19
14:04
Вариант с удачей = 1 надо отдельно обработать, чтобы не попасть на деление на 0.
44 Mort
 
29.04.19
14:10
А блин, низкий уровень удачи вообще сделает невозможным выпадение 6, чего не должно быть. Линейной функцией не обойтись. Надо результат ГСЧ в степень возводить.
45 garantNo4x
 
29.04.19
14:13
статистики сейчас наверное в гробах заворочались
46 Mort
 
29.04.19
14:14
Или даже так :

Результат = ?(ГСЧ()<Удача, 1,0) + ?(ГСЧ()<Удача, 1,0) + ?(ГСЧ()<Удача, 1,0) + ?(ГСЧ()<Удача, 1,0) + ?(ГСЧ()<Удача, 1,0) + ?(ГСЧ()<Удача, 1,0)

Этот вариант мне нравится больше.
47 Йохохо
 
29.04.19
14:15
(44) отсеки по три сигма)
48 RomanYS
 
29.04.19
14:16
(46) Невезучий получит 0. Такого даже самый бракованный кубик себе не позволяет))
49 Mort
 
29.04.19
14:18
(48)

1 + ?(ГСЧ()<Удача, 1,0) + ?(ГСЧ()<Удача, 1,0) + ?(ГСЧ()<Удача, 1,0) + ?(ГСЧ()<Удача, 1,0) + ?(ГСЧ()<Удача, 1,0)

Впрочем тут ГСЧ должен работать 0 - 0.9999999. Можно отдельно проработать граничные варианты.
50 ejikbeznojek
 
29.04.19
14:30
если удача = 0 тогда
  возврат 1;
если удача=100
возврат 6
иначе
окр(ГенераторСлучайныхЧисел.СлучайноеЧисло(1, 6)*(удача/50),0)
конец
51 garantNo4x
 
29.04.19
14:33
не понятно что такое удачливость 50 (точнее это и не требует понимания, так как это бред записанный в цифре.) Т.е. вместо привычных вероятностей появления неких чисел должны появляться те же числа но не равные загаданному. Т.е. допустим человек загадал  1 но ему не везет)) для этого надо или кубиков больше или знать что он загадал.
52 Nikoss
 
29.04.19
14:38
(49)
Выпало    Колво раз
1    3 064
2    15 527
3    31 307
4    31 118
5    15 827
6    3 157
из 100к проходов, при 50% удачи
53 Mort
 
29.04.19
14:41
(52) практически нормальное распределение( Подозревал что так может быть. Надо ещё думать.
54 PuhUfa
 
29.04.19
14:42
>>Скажем, при удачливости=50 необходимо чтобы вероятность выпадения всех чисел была одинаковой

Кто и как проверяет это? "вероятность выпадения" <> "фактическому выпадению"
55 Nikoss
 
29.04.19
14:45
(54) я проверю, давай свою формулу)
56 Вафель
 
29.04.19
14:52
(54) запускаешь тыщу, нет 10 тыщ раз и смотришь
57 Deon
 
29.04.19
15:46
(55)
Функция Число6(Параметр_Удача, ГСЧ)
    Распределить = 1000000;
    Выпало = ГСЧ.СлучайноеЧисло(1, Распределить);

    Удача = (Параметр_Удача*2-100)/100; // от -1 до 1
    рУдача = ?(Удача < 0, -Удача, Удача);
    Распределено = 0;
    
    Для н = -6 по -1 Цикл
        Куб = -н;
        БазоваяДоля = (Распределить-Распределено) / Куб;
        ПределУдачиКуба = Распределено + БазоваяДоля + рУдача*((Распределить-Распределено)-БазоваяДоля);
        Если Выпало <= ПределУдачиКуба Тогда
            Если Удача < 0 Тогда
                Возврат 7-Куб;
            Иначе
                Возврат Куб;
            КонецЕсли;
        КонецЕсли;
        Распределено = ПределУдачиКуба;
    КонецЦикла;
КонецФункции
58 Ванпанчмен
 
29.04.19
19:29
(0) Предлагаю такой вариант:

x = Рандомное число от 0 до 1, не целое.
y = удача, от 0 до 1, не целое

Результат = Округлить(x ^ (1 / y - 1)) * 5 + 1);
целое число от 1 до 6.
Округляем меньше 0.5 в меньшую сторону, больше 0.5 в большую сторону.
59 Franchiser
 
гуру
29.04.19
19:36
Почитай про парадокс монти холла.
Можно применить для удачливости
60 Franchiser
 
гуру
29.04.19
19:37
просто дважды генерируй число с изменением решения
61 Ванпанчмен
 
29.04.19
23:02
+(58) более интуитивный способ решения, без математических формул, чисто на алгоритме:

Рассмотрим удачу не как число от 1 до 100, а как положительное/отрицательное число.
Например удача 0 - ничего не добавляет, то есть выпадение любого значения равновероятно. А удача +5 дает выше шанс выиграть. Удача -5 наоборот уменьшает шанс выиграть. Тогда алгоритм такой:

Кидаем кость столько раз + 1, какое абсолютное значение удачи, и выбираем самое удачное/неудачное значение. Например, если удача +1, то кидаем 2 раза и выбираем лучший бросок. А если удача -2, то кидаем 3 раза и выбираем худший вариант. Если удача 0, то кидаем 1 раз.
62 RomanYS
 
29.04.19
23:25
(61) Идея хороша, логична. Но от равномерности там очень далеко, на экспоненту похоже(зависимость среднего результата от твоей "удачи")
1        3,504
2        4,515
3        4,937
4        5,254
5        5,431
6        5,487
7        5,622
8        5,681
9        5,773
10        5,797
11        5,846
12        5,875
13        5,904
14        5,919
15        5,921
16        5,95
17        5,944
18        5,96
19        5,976
20        5,972
63 RomanYS
 
29.04.19
23:27
+(62) среднее считалось на тысяче повторов. Левая колонка - число бросков из которых делаем выбор.
64 Ванпанчмен
 
30.04.19
00:15
(62) Да, она не равномерна. Потому что 100% удача в данном случае равна "+бесконечность" к удаче.
100% удача должна быть не достижима, ИМХО, если это не "режим Бога".
65 seevkik
 
30.04.19
03:50
Вообще, все зависит от того, какой результат мы хотим видеть - удача число от 0 до 100 или от -100 до 100?
Что дает удача 100 -сто побед из ста или как?
66 seevkik
 
30.04.19
03:51
(65) упс, не прочитал тему полностью)
67 Сияющий в темноте
 
20.05.19
18:52
Предположим вероятность выпадения 1 у вас V(1) и т.д. до 6.
получаем интервалы 0..v(1) это 1
v(1)..v(1)+v(2) это 2
...
v(1)+...+v(5)..v(1)+...+v(6) это 6
генерим число в интервале 0..v(1)+...+v(6) и получаем то,что нужно.
68 RomanYS
 
20.05.19
19:14
(67) судя по (30) ТС ждал предложений как раз по расчету этих v(i)
69 garantNo4x
 
20.05.19
19:40
Вероятность это просто число для некой функции P() заданной на неком множестве исходов принимающее значение от 0 до 1.
Вы требуете что бы вероятность была сколь угодно мала на неком множестве и все же принимала значения которые бы делали ее похожими на вероятность. Так вот похожими на вероятность она похожа если для всех событий равна 1.
Ну понимаете ? Далее вы добиваетесь того, что бы сама вероятность была или близка к равной для каждой грани или же наоборот.
Ну допустим вы начали конструировать такую функцию  - для нее требования то понятные.  
Пространство то исходов кто определит по-человечески ?
Потому что далее вообще то ничего сложного.
70 Йохохо
 
20.05.19
19:43
(69) пятница?
71 garantNo4x
 
20.05.19
19:47
(70) типа того. Только не я ее начал.
72 Тарзанчик Бостон
 
20.05.19
20:01
Таки чем не подошел вариант (58), предложенный неким Ванпанчменом? Сразу видно, что человек разбирается в вопросах.