00001 #ifndef RANDOM_VAR_H
00002 #define RANDOM_VAR_H
00003
00004 typedef int (*weight_func)(int val);
00005
00006
00007
00008
00009
00010
00011
00012 class random_var
00013 {
00014 int start, end;
00015 std::vector<int> weights;
00016 int total;
00017
00018 public:
00019 random_var(int c);
00020 random_var(int s, int e, weight_func w_ = NULL);
00021 random_var(int s, int e, std::vector<int> ws);
00022
00023 const random_var& operator=(const random_var& other);
00024
00025 int weight(int val) const;
00026 int roll() const;
00027 operator int() const
00028 {
00029 return (roll());
00030 }
00031
00032 double expected() const;
00033 int min() const;
00034 int max() const;
00035
00036 protected:
00037 void init_weights(weight_func w);
00038 void init();
00039 int roll2val(int r) const;
00040 };
00041
00042 random_var constant(int n);
00043 random_var operator+(const random_var& x, const random_var& y);
00044 random_var negate(const random_var& x);
00045 random_var operator-(const random_var& x, const random_var& y);
00046 const random_var& operator+=(random_var& x, const random_var& y);
00047 const random_var& operator-=(random_var& x, const random_var& y);
00048 random_var operator/(const random_var& x, int d);
00049
00050 namespace rv
00051 {
00052 random_var max(const random_var& x, const random_var& y);
00053 random_var min(const random_var& x, const random_var& y);
00054 random_var roll_dice(int d, int n);
00055 random_var random2(int n);
00056 }
00057
00058 #endif