Новости Старт 6го сезона Grim League
  • 834
  • 0
4 мая в 18-00 стартует шестой сезон Community лиги по одной из лучших игр в жанре arpg Grim Dawn. Сезон представляет собой глобальную модификацию игры, включающую в себя расширение мира, изменение...
Новости Дата релиза Baldur's Gate III
  • 20.702
  • 1
Наконец-то дождались - "Baldur's Gate III" покидает ранний доступ, и в августе 2023 выходит в полноценный релиз, о чём стало известно на церемонии "The Game Awards 2022". С момента выхода игры в...
Новости Итоги года от The Game Awards 2022
  • 14.229
  • 0
Вчера прошла ежегодная церемония награждения проектов в индустрии компьютерных игр и киберспорта. Самую главную награда - "Игра года" забрала игра "Elden Ring" от японских разработчиков...
Новости Анонс Assassin's Creed Mirage
  • 19.800
  • 6
На сегодняшнем мероприятии «Ubisoft Forward» была анонсированна новая часть вселенной «Assassin's Creed» под названием «Mirage». В роли протагониста будет Басим ибн Исхак, играющие в «Assassin’s...

Гильдии 1.5 Предложение по азартным играм (в кости)

TopLayer

Наемник
Участник форума
Регистрация
22 Апр 2017
Сообщения
899
Реакции
364
Баллы
191
Лучшие ответы
24
#31
Быстрый текст 50 бросков @@n1kx 'ом показал, что рандомайзер винды, которым пользуется Готика, выдает 6 в 25%, а 3 в 8% случаев. От чего это зависит и повторяется ли в разное время суток и для разных версий ОС, непонятно.
Теперь попробуй бросать настоящий кубик - будешь нередко получать аналогичные результаты.
Hlp_Random(6) + 1 отлично подходит для имитации броска реальной игровой кости.
Я не смог придумать, как достаточно просто сделать разную частоту выпадения граней, кроме проверки четности при рандоме(100).
Могу такое предложить: сначала задаёшь вероятности выпадения граней через параметр "удача" (от 0 до 100), а потом запрашиваешь рандомное значение кубика.
C:
SetupDiceProb(10); // невезучий весьма
var int value1, value2;
value1 = GetDice();
value2 = GetDice();
C:
const int DICE_MAX_LUCK = 100; // должно делиться на 5

// распределение вероятностей выпадения между гранями
// нулевой индекс не используется
var int DiceProb[7];

// меняет DiceProb сдвигая одну единичку правее
func void IncreaseLuck()
{
    // пытаемся сдвинуть 1 так, чтобы вероятности были более равномерными
    if DiceProb[5] && DiceProb[5] > DiceProb[6] + 1 { DiceProb[5] -= 1; DiceProb[6] += 1; return; };
    if DiceProb[4] && DiceProb[4] > DiceProb[5] + 1 { DiceProb[4] -= 1; DiceProb[5] += 1; return; };
    if DiceProb[3] && DiceProb[3] > DiceProb[4] + 1 { DiceProb[3] -= 1; DiceProb[4] += 1; return; };
    if DiceProb[2] && DiceProb[2] > DiceProb[3] + 1 { DiceProb[2] -= 1; DiceProb[3] += 1; return; };
    if DiceProb[1] && DiceProb[1] > DiceProb[2] + 1 { DiceProb[1] -= 1; DiceProb[2] += 1; return; };
    
    // если не вышло, ищем наименее расбалансирующий сдвиг
    var int bestValue; bestValue = -100000;
    var int bestIndex; bestIndex = -1;
    
    if DiceProb[1] && DiceProb[1] - DiceProb[2] > bestValue { bestValue = DiceProb[1] - DiceProb[2]; bestIndex = 1; };
    if DiceProb[2] && DiceProb[2] - DiceProb[3] > bestValue { bestValue = DiceProb[2] - DiceProb[3]; bestIndex = 2; };
    if DiceProb[3] && DiceProb[3] - DiceProb[4] > bestValue { bestValue = DiceProb[3] - DiceProb[4]; bestIndex = 3; };
    if DiceProb[4] && DiceProb[4] - DiceProb[5] > bestValue { bestValue = DiceProb[4] - DiceProb[5]; bestIndex = 4; };
    if DiceProb[5] && DiceProb[5] - DiceProb[6] > bestValue { bestValue = DiceProb[5] - DiceProb[6]; bestIndex = 5; };
    
    if bestIndex == 1 { DiceProb[1] -= 1; DiceProb[2] += 1; }
    else if bestIndex == 2 { DiceProb[2] -= 1; DiceProb[3] += 1; }
    else if bestIndex == 3 { DiceProb[3] -= 1; DiceProb[4] += 1; }
    else if bestIndex == 4 { DiceProb[4] -= 1; DiceProb[5] += 1; }
    else if bestIndex == 5 { DiceProb[5] -= 1; DiceProb[6] += 1; };
};

// устанавиливаем шансы выпадения разных граней в зависимости от удачи
// 0 <= luck <= DICE_MAX_LUCK
func void SetupDiceProb(var int luck)
{
    DiceProb[1] = DICE_MAX_LUCK / 5;
    DiceProb[2] = 0;
    DiceProb[3] = 0;
    DiceProb[4] = 0;
    DiceProb[5] = 0;
    DiceProb[6] = 0;
    
    // DICE_MAX_LUCK возможных итераций
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
    if luck > 0 { luck -= 1; IncreaseLuck(); };
};

// бросок кубика с учётом относительных вероятностей DiceProb
func int GetDice()
{
    var int random;
    random = Hlp_Random(DiceProb[1] + DiceProb[2] + DiceProb[3] + DiceProb[4] + DiceProb[5] + DiceProb[6]);
    if random < DiceProb[1] { return 1; }; random -= DiceProb[1];
    if random < DiceProb[2] { return 2; }; random -= DiceProb[2];
    if random < DiceProb[3] { return 3; }; random -= DiceProb[3];
    if random < DiceProb[4] { return 4; }; random -= DiceProb[4];
    if random < DiceProb[5] { return 5; }; random -= DiceProb[5];
    return 6;
};
 

Alex1

Избранник богов
Команда форума
Модератор раздела
Редактор раздела
Модостроитель
 
Почётный пользователь
Участник форума
Регистрация
22 Янв 2014
Сообщения
11.248
Реакции
5.641
Баллы
976
Лучшие ответы
414
#32
@TopLayer, благодарю! Интересная тема с "удачей".
 
Сверху Снизу