Вход | Регистрация
 
Информационные технологии :: Математика и алгоритмы

Алгоритм управляемого рандома

Алгоритм управляемого рандома
Я
   1Сергей
 
29.04.19 - 10:08
Допустим, есть функция, которая генерирует случайное число, эмулируя бросание игральной кости
Функция Кость6(Удачливость=50)
    ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел();
    Возврат ГенераторСлучайныхЧисел.СлучайноеЧисло(1, 6);
КонецФункции


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

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

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

А вообще тут не кривая распределения, а двумерная поверхность.
   Mort
 
17 - 29.04.19 - 10:57
1 + 5 * (Удача) + (2.5 * (1 - ABS(2 * Удача - 1))) * ГСЧ(-1,1)
   Mort
 
18 - 29.04.19 - 10:58
Нечто подобное делал недавно когда генерировал плавынй переход из одного шума Перлина в другой.
   1Сергей
 
19 - 29.04.19 - 10:58
Получается, надо придумать функцию к таким данным:
http://pics.rsh.ru/img/temp_8yw39ynq.png
   exwill
 
20 - 29.04.19 - 11:00
(0) Лучший способ влиять на удачливость в костях - это использовать сравнительно малоизвестный и контринтуитивный математический факт отсутствия транзитивности для вероятностей.
   Кодер
 
21 - 29.04.19 - 11:00
Распиши, что должно получаться для двойки.
   Mort
 
22 - 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);
КонецФункции
   Mort
 
24 - 29.04.19 - 11:10
(23) Удачливость может быть и 30%.
   Кирпич
 
25 - 29.04.19 - 11:10
(24) в таблице нет про 30
   Nikoss
 
26 - 29.04.19 - 11:16
(0) не честное онлайн казино на 1С пилишь чтоли?))
   Mort
 
27 - 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 ...
   RomanYS
 
29 - 29.04.19 - 11:28
(9) Вид коллекции непринципиален: массивы, структуры или ТЗ.
Не понятна суть проблемы (0)
математика? - это одно, нужны какие-то критерии;
техника реализации - интервалы и цикл проверки, здесь вроде проблем не видно.
   1Сергей
 
30 - 29.04.19 - 11:31
(29) с учетом (15), просто интересно посмотреть на предложенные варианты. При которых удачливость более-менее равномерно размазывалась на шансы выпадения той или иной цифры
 
 Рекламное место пустует
   ЛЮС
 
31 - 29.04.19 - 11:36
Нда, математика страшная штука. Вон Mort сам с собой дискуссию ведет.
   RomanYS
 
32 - 29.04.19 - 11:36
(30) Понятно. Всё-таки математика и никаких критериев))
Предложу свой критерий: матожидание результата должно равномерно изменяться от удачливости:
при 0% - матожидание 1
при 50% - 3.5
при 100% - 6
   1Сергей
 
33 - 29.04.19 - 11:36
(31) он хоть что-то предложил
   Nikoss
 
34 - 29.04.19 - 11:40
(0) при удачливости 10% может выпасть 6ка?
   1Сергей
 
35 - 29.04.19 - 11:44
(34) не важно. Если можешь предложить вариант с ответом да или нет на этот вопрос, буду рад
   Deon
 
36 - 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) конечно может
   Nikoss
 
38 - 29.04.19 - 13:39
(37) в скольки случаях из 1 000 000?
   ЛЮС
 
39 - 29.04.19 - 13:47
(36) Зависимость не может быть линейной. На одном конце диапазона она 1, на другом 0, посередине 1/6. Эти три точки никак не дают линейную зависимость, в лучшем случае - комбинацию двух линейных с переломом
.
   Deon
 
40 - 29.04.19 - 13:50
(39) Я потому и предлагаю удачу считать от -100 до +100, где в переломной точке 0 вероятность любого числа 1/6
Если удача отрицательна, то зависимость линейно тянет к выпадению единицы. Если положительна, то тянет к шестерке
   Mort
 
41 - 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))
   Mort
 
42 - 29.04.19 - 14:03
*НомерГрани = МИН(y * 6, 6) Минимум конечно
   Mort
 
43 - 29.04.19 - 14:04
Вариант с удачей = 1 надо отдельно обработать, чтобы не попасть на деление на 0.
   Mort
 
44 - 29.04.19 - 14:10
А блин, низкий уровень удачи вообще сделает невозможным выпадение 6, чего не должно быть. Линейной функцией не обойтись. Надо результат ГСЧ в степень возводить.
   garantNo4x
 
45 - 29.04.19 - 14:13
статистики сейчас наверное в гробах заворочались
   Mort
 
46 - 29.04.19 - 14:14
Или даже так :

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

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

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

Впрочем тут ГСЧ должен работать 0 - 0.9999999. Можно отдельно проработать граничные варианты.
   ejikbeznojek
 
50 - 29.04.19 - 14:30
если удача = 0 тогда
  возврат 1;
если удача=100
возврат 6
иначе
окр(ГенераторСлучайныхЧисел.СлучайноеЧисло(1, 6)*(удача/50),0)
конец
   garantNo4x
 
51 - 29.04.19 - 14:33
не понятно что такое удачливость 50 (точнее это и не требует понимания, так как это бред записанный в цифре.) Т.е. вместо привычных вероятностей появления неких чисел должны появляться те же числа но не равные загаданному. Т.е. допустим человек загадал  1 но ему не везет)) для этого надо или кубиков больше или знать что он загадал.
   Nikoss
 
52 - 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% удачи
   Mort
 
53 - 29.04.19 - 14:41
(52) практически нормальное распределение( Подозревал что так может быть. Надо ещё думать.
   PuhUfa
 
54 - 29.04.19 - 14:42
>>Скажем, при удачливости=50 необходимо чтобы вероятность выпадения всех чисел была одинаковой

Кто и как проверяет это? "вероятность выпадения" <> "фактическому выпадению"
   Nikoss
 
55 - 29.04.19 - 14:45
(54) я проверю, давай свою формулу)
   Вафель
 
56 - 29.04.19 - 14:52
(54) запускаешь тыщу, нет 10 тыщ раз и смотришь
   Deon
 
57 - 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 в большую сторону.
   Franchiser
 
59 - 29.04.19 - 19:36
Почитай про парадокс монти холла.
Можно применить для удачливости
   Franchiser
 
60 - 29.04.19 - 19:37
просто дважды генерируй число с изменением решения
   Ванпанчмен
 
61 - 29.04.19 - 23:02
+(58) более интуитивный способ решения, без математических формул, чисто на алгоритме:

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

Кидаем кость столько раз + 1, какое абсолютное значение удачи, и выбираем самое удачное/неудачное значение. Например, если удача +1, то кидаем 2 раза и выбираем лучший бросок. А если удача -2, то кидаем 3 раза и выбираем худший вариант. Если удача 0, то кидаем 1 раз.
   RomanYS
 
62 - 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
   RomanYS
 
63 - 29.04.19 - 23:27
+(62) среднее считалось на тысяче повторов. Левая колонка - число бросков из которых делаем выбор.
   Ванпанчмен
 
64 - 30.04.19 - 00:15
(62) Да, она не равномерна. Потому что 100% удача в данном случае равна "+бесконечность" к удаче.
100% удача должна быть не достижима, ИМХО, если это не "режим Бога".
   seevkik
 
65 - 30.04.19 - 03:50
Вообще, все зависит от того, какой результат мы хотим видеть - удача число от 0 до 100 или от -100 до 100?
Что дает удача 100 -сто побед из ста или как?
   seevkik
 
66 - 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) и получаем то,что нужно.
   RomanYS
 
68 - 20.05.19 - 19:14
(67) судя по (30) ТС ждал предложений как раз по расчету этих v(i)
   garantNo4x
 
69 - 20.05.19 - 19:40
Вероятность это просто число для некой функции P() заданной на неком множестве исходов принимающее значение от 0 до 1.
Вы требуете что бы вероятность была сколь угодно мала на неком множестве и все же принимала значения которые бы делали ее похожими на вероятность. Так вот похожими на вероятность она похожа если для всех событий равна 1.
Ну понимаете ? Далее вы добиваетесь того, что бы сама вероятность была или близка к равной для каждой грани или же наоборот.
Ну допустим вы начали конструировать такую функцию  - для нее требования то понятные.  
Пространство то исходов кто определит по-человечески ?
Потому что далее вообще то ничего сложного.
   Йохохо
 
70 - 20.05.19 - 19:43
(69) пятница?
   garantNo4x
 
71 - 20.05.19 - 19:47
(70) типа того. Только не я ее начал.
   Тарзанчик Бостон
 
72 - 20.05.19 - 20:01
Таки чем не подошел вариант (58), предложенный неким Ванпанчменом? Сразу видно, что человек разбирается в вопросах.


Список тем форума
Рекламное место пустует  Рекламное место пустует
Здесь можно задать вопрос "Как сделать?" и получить кучу ответов, что тебе это делать не надо. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.