
OK, a statistics library sounds better to me, too. So how about that (speaking in pseudo code): There is a base class: distribution { get_probability(value); // P(value) get_comulutative_probability(value); //P(x <= value) generate_random(); get_expectation(); get_variance(); //more } Specific distributions will derive from it and expose their parameters too; discrete distributions may have a method get_values(). Factories: distribution create_distribution(samples, distribution_type); // given a specific distribution and a set of samples find the MLE (the parameters of the distribution); implemented specifically for each distribution distribution create_ distribution(samples); // given a set of samples approximate an unknown distribution (e.g. with a Monte Carlo or smth like this); maybe the method for the generation will be a parameter too. There may be methods of inferring some properties of a distribution without generating the whole of it first. Operations: distribution create_joint_distr(distribution, distribution); distribution create_sum(distribution, distribution); distribution create_difference(distribution, distribution); Other things I can think of.