#include <iostream>
#include <stdlib.h>
unsigned throw_dice_mod6()
{
return rand() % 6;
}
unsigned throw_dice_fred()
{
static const unsigned divisor = static_cast<unsigned>((RAND_MAX + 1.0) / 6);
static const unsigned safe_bound = divisor * 6;
unsigned x;
do x = rand(); while (x >= safe_bound);
return x / divisor;
}
void test(const char* description, unsigned throw_function())
{
std::cout << description << '\n';
int count[6] = {0};
for (int i = 0; i < 60000; ++i)
{
++count[throw_function()];
}
for (int i = 0; i < 6; ++i)
{
std::cout << (i + 1) << ": " << count[i] << '\n';
}
}
int main()
{
test("mod6", throw_dice_mod6);
test("fred", throw_dice_fred);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkbGliLmg+Cgp1bnNpZ25lZCB0aHJvd19kaWNlX21vZDYoKQp7CiAgICByZXR1cm4gcmFuZCgpICUgNjsKfQoKdW5zaWduZWQgdGhyb3dfZGljZV9mcmVkKCkKewoJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRpdmlzb3IgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oKFJBTkRfTUFYICsgMS4wKSAvIDYpOwoJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhZmVfYm91bmQgPSBkaXZpc29yICogNjsKCXVuc2lnbmVkIHg7CglkbyB4ID0gcmFuZCgpOyB3aGlsZSAoeCA+PSBzYWZlX2JvdW5kKTsKCXJldHVybiB4IC8gZGl2aXNvcjsKfQoKdm9pZCB0ZXN0KGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uLCB1bnNpZ25lZCB0aHJvd19mdW5jdGlvbigpKQp7CglzdGQ6OmNvdXQgPDwgZGVzY3JpcHRpb24gPDwgJ1xuJzsKCWludCBjb3VudFs2XSA9IHswfTsKCWZvciAoaW50IGkgPSAwOyBpIDwgNjAwMDA7ICsraSkKCXsKCQkrK2NvdW50W3Rocm93X2Z1bmN0aW9uKCldOwoJfQoJZm9yIChpbnQgaSA9IDA7IGkgPCA2OyArK2kpCgl7CgkJc3RkOjpjb3V0IDw8IChpICsgMSkgPDwgIjogIiA8PCBjb3VudFtpXSA8PCAnXG4nOwoJfQp9CgppbnQgbWFpbigpCnsKCXRlc3QoIm1vZDYiLCB0aHJvd19kaWNlX21vZDYpOwoJdGVzdCgiZnJlZCIsIHRocm93X2RpY2VfZnJlZCk7Cn0K