#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <random>
std::mt19937& GetRand()
{
std::random_device rd;
std::mt19937 gen(rd());
return gen;
}
template <typename T>
T Draw(T lo, T hi)
{
if (lo == hi)
return lo;
if (hi < lo)
std::swap(lo, hi);
std::uniform_int_distribution<T> d(lo, hi);
return d(GetRand());
}
template <typename T>
T GaussNormal(T lo, T hi)
{
if (lo == hi)
return lo;
if (hi < lo)
std::swap(lo, hi);
std::normal_distribution<T> d(lo, hi);
return d(GetRand());
}
int MINMAX(int min, int value, int max)
{
register int tv;
tv = (min > value ? min : value);
return (max < tv) ? max : tv;
}
int main()
{
int iSkillBonus, iNormalHitBonus;
unsigned long long counter = 0;
for (;;)
{
iSkillBonus = MINMAX(-30, (GaussNormal(0.0f, 5.0f) + 0.5f), 30);
if (abs(iSkillBonus) <= 20)
iNormalHitBonus = -2 * iSkillBonus + abs(Draw(-8, 8) + Draw(-8, 8)) + Draw(1, 4);
else
iNormalHitBonus = -2 * iSkillBonus + Draw(1, 5);
counter += 1;
if (iNormalHitBonus >= 58) ////if normal hit bonus is 55 or higher, the loop will stop
break;
//you can delete this if you want to make it faster
//cout << "normal hit bonus: " << iNormalHitBonus << endl;
//cout << "skill bonus: " << iSkillBonus << endl;
//
}
std::cout << "you've used " << counter << " changes" << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8Y21hdGg+IAojaW5jbHVkZSA8cmFuZG9tPgoKCnN0ZDo6bXQxOTkzNyYgR2V0UmFuZCgpCnsKCXN0ZDo6cmFuZG9tX2RldmljZSByZDsKICAgIHN0ZDo6bXQxOTkzNyBnZW4ocmQoKSk7CglyZXR1cm4gZ2VuOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KVCBEcmF3KFQgbG8sIFQgaGkpCnsKCWlmIChsbyA9PSBoaSkKCQlyZXR1cm4gbG87CgoJaWYgKGhpIDwgbG8pCgkJc3RkOjpzd2FwKGxvLCBoaSk7CgoJc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248VD4gZChsbywgaGkpOwoJcmV0dXJuIGQoR2V0UmFuZCgpKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ClQgR2F1c3NOb3JtYWwoVCBsbywgVCBoaSkKewoJaWYgKGxvID09IGhpKQoJCXJldHVybiBsbzsKCglpZiAoaGkgPCBsbykKCQlzdGQ6OnN3YXAobG8sIGhpKTsKCglzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248VD4gZChsbywgaGkpOwoJcmV0dXJuIGQoR2V0UmFuZCgpKTsKfQoKaW50IE1JTk1BWChpbnQgbWluLCBpbnQgdmFsdWUsIGludCBtYXgpCnsKICAgIHJlZ2lzdGVyIGludCB0djsKIAogICAgdHYgPSAobWluID4gdmFsdWUgPyBtaW4gOiB2YWx1ZSk7CiAgICByZXR1cm4gKG1heCA8IHR2KSA/IG1heCA6IHR2Owp9CiAKCmludCBtYWluKCkKewogICAgaW50IGlTa2lsbEJvbnVzLCBpTm9ybWFsSGl0Qm9udXM7CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgY291bnRlciA9IDA7CgogICAgZm9yICg7OykKICAgIHsKICAgICAgICBpU2tpbGxCb251cyA9IE1JTk1BWCgtMzAsIChHYXVzc05vcm1hbCgwLjBmLCA1LjBmKSArIDAuNWYpLCAzMCk7CiAgICAgICAgaWYgKGFicyhpU2tpbGxCb251cykgPD0gMjApCiAgICAgICAgICAgIGlOb3JtYWxIaXRCb251cyA9IC0yICogaVNraWxsQm9udXMgKyBhYnMoRHJhdygtOCwgOCkgKyBEcmF3KC04LCA4KSkgKyBEcmF3KDEsIDQpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgaU5vcm1hbEhpdEJvbnVzID0gLTIgKiBpU2tpbGxCb251cyArIERyYXcoMSwgNSk7CiAgIAogICAgICAgIGNvdW50ZXIgKz0gMTsKICAgICAgICBpZiAoaU5vcm1hbEhpdEJvbnVzID49IDU4KSAvLy8vaWYgbm9ybWFsIGhpdCBib251cyBpcyA1NSBvciBoaWdoZXIsIHRoZSBsb29wIHdpbGwgc3RvcAogICAgICAgICAgICBicmVhazsKICAgCgogCiAgICAgICAgLy95b3UgY2FuIGRlbGV0ZSB0aGlzIGlmIHlvdSB3YW50IHRvIG1ha2UgaXQgZmFzdGVyCiAgICAgICAgLy9jb3V0IDw8ICJub3JtYWwgaGl0IGJvbnVzOiAiIDw8IGlOb3JtYWxIaXRCb251cyA8PCBlbmRsOwogICAgICAgIC8vY291dCA8PCAic2tpbGwgYm9udXM6ICIgPDwgaVNraWxsQm9udXMgPDwgZW5kbDsKICAgICAgICAvLwogCiAgICB9CiAKICAgIHN0ZDo6Y291dCA8PCAieW91J3ZlIHVzZWQgIiA8PCBjb3VudGVyIDw8ICIgY2hhbmdlcyIgPDwgc3RkOjplbmRsOwogCiAgICByZXR1cm4gMDsKfQ==