- Регистрация
- 22 Апр 2017
- Сообщения
- 937
- Реакции
- 394
- Баллы
- 196
- Лучшие ответы
- 26
Быстрый текст 50 бросков @@n1kx 'ом показал, что рандомайзер винды, которым пользуется Готика, выдает 6 в 25%, а 3 в 8% случаев. От чего это зависит и повторяется ли в разное время суток и для разных версий ОС, непонятно.
Hlp_Random(6) + 1
отлично подходит для имитации броска реальной игровой кости.
Я не смог придумать, как достаточно просто сделать разную частоту выпадения граней, кроме проверки четности при рандоме(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;
};