|
Алгоритм управляемого рандома | ☑ | ||
---|---|---|---|---|
0
1Сергей
29.04.19
✎
10:08
|
Допустим, есть функция, которая генерирует случайное число, эмулируя бросание игральной кости
Как можно повлиять на "удачливость" результата? Скажем, при удачливости=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), предложенный неким Ванпанчменом? Сразу видно, что человек разбирается в вопросах.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |