Новости Релиз Of Ash and Steel состоится 6 ноября
  • 812
  • 0
Of Ash and Steel: атмосферный экшен выходит 6 ноября 6 ноября станет важной датой для поклонников сложных и атмосферных игр - именно в этот день состоится релиз долгожданного проекта Of Ash and...
Новости В Of Ash and Steel начался закрытый плейтест
  • 8.773
  • 12
Разработчики "Русской Готики" объявили о старте закрытого плейтеста. Если вы оставляли заявку на участие, не забудьте проверить электронную почту или посмотреть свою библиотеку - возможно игра уже...
С Днём России!
  • 7.616
  • 6
Дорогие друзья! Поздравляю вас с Днём России! Этот праздник напоминает нам о богатой истории и культуре нашей страны, о её величии и непоколебимом духе народа! Желаю вам крепкого здоровья...
Новости Анонсирован Atomic Heart II

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

TopLayer

Наемник
Участник форума
Регистрация
22 Апр 2017
Сообщения
958
Реакции
413
Баллы
226
Лучшие ответы
28
#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.715
Реакции
6.266
Баллы
976
Лучшие ответы
422
#32
@TopLayer, благодарю! Интересная тема с "удачей".
 
Сверху Снизу