1 #ifndef ZZGO_PROBDIST_H
2 #define ZZGO_PROBDIST_H
4 /* Tools for picking an item according to a probability distribution. */
6 /* The probability distribution structure is designed to be once
7 * initialized, then random items assigned a value repeatedly and
8 * random items picked repeatedly as well. */
13 /* The interface looks a bit funny-wrapped since we used to switch
14 * between different probdist representations. */
18 float *items
; // [n], items[i] = P(pick==i)
21 #define probdist_total(pd) ((pd)->total)
22 #define probdist_one(pd, i) ((pd)->items[i])
23 /* Probability so small that it's same as zero; used to compensate
24 * for probdist.total inaccuracies. */
25 #define PROBDIST_EPSILON 0.01
27 static void probdist_set(struct probdist
*pd
, int i
, float val
);
29 int probdist_pick(struct probdist
*pd
);
32 /* We disable the assertions here since this is quite time-critical
33 * part of code, and also the compiler is reluctant to inline the
34 * functions otherwise. */
36 probdist_set(struct probdist
*pd
, int i
, float val
)
39 assert(i
>= 0 && i
< pd
->n
);
42 pd
->total
+= val
- pd
->items
[i
];