static void prepare_starting_region(region * r) { int n, t; double p; assert(r->land); /* population between 30% and 60% of max */ p = rng_double(); n = (int)(r->terrain->size * (0.3 + p * 0.3)); rsetpeasants(r, n); /* trees: don't squash the peasants, and at least 5% should be forrest */ t = (rtrees(r, 2) + rtrees(r, 1) / 2) * TREESIZE; if (t < r->terrain->size / 20 || t + n > r->terrain->size) { double p2 = 0.05 + rng_double() * (1.0 - p - 0.05); int maxtrees = (int)(r->terrain->size / 1.25 / TREESIZE); /* 1.25 = each young tree will take 1/2 the space of old trees */ int trees = (int)(p2 * maxtrees); rsettrees(r, 2, trees); rsettrees(r, 1, trees / 2); rsettrees(r, 0, trees / 4); } /* horses: between 1% and 2% */ p = rng_double(); rsethorses(r, (int)(r->terrain->size * (0.01 + p * 0.01))); if (!markets_module()) { fix_demand(r); } }
/* NormalRand aus python, random.py geklaut, dort ist Referenz auf * den Algorithmus. mu = Mittelwert, sigma = Standardabweichung. * http://de.wikipedia.org/wiki/Standardabweichung#Diskrete_Gleichverteilung.2C_W.C3.BCrfel */ double normalvariate(double mu, double sigma) { static const double NV_MAGICCONST = 1.7155277699214135; /* STATIC_CONST: a constant */ double z; for (;;) { double u1 = rng_double(); double u2 = 1.0 - rng_double(); z = NV_MAGICCONST * (u1 - 0.5) / u2; if (z * z / 4.0 <= -log(u2)) { break; } } return mu + z * sigma; }
int ntimespprob(int n, double p, double mod) { int count = 0; int i; for (i = 0; i < n && p > 0; i++) { if (rng_double() < p) { count++; p += mod; } } return count; }
void plagues(region * r) { int peasants; int i; int dead = 0; peasants = rpeasants(r); dead = (int)(0.5 + PLAGUE_VICTIMS * peasants); for (i = dead; i != 0; i--) { if (rng_double() < PLAGUE_HEALCHANCE && rmoney(r) >= PLAGUE_HEALCOST) { rsetmoney(r, rmoney(r) - PLAGUE_HEALCOST); --dead; } } if (dead > 0) { message *msg = add_message(&r->msgs, msg_message("pest", "dead", dead)); msg_release(msg); deathcounts(r, dead); rsetpeasants(r, peasants - dead); } }
double Runif::runif(double min_val, double max_val) const { return min_val + rng_double(state)*(max_val - min_val); }
bool chance(double x) { if (x >= 1.0) return true; return rng_double() < x; }