*"Bonusly makes work better for everyone, from the new hire to the CEO. It empowers teams across
the world to recognize and reward one another for the great work they do day in, and day
out."*
[1] This sounds great. But what to do when you simply want to
reward all your colleagues? Or want to make sure that the ones that do great stuff, but less visible
to the other, get a reward? Or you simply cannot choose, but want to prevent expiration of the
precious 'give-a-way' points by the end of the month? Here is where the *Wheel of Fortune*
can help! Just create an access token to log in and let the machine decide on your behalf. You can
choose whether or not to make the winning chances pure random or to favour the ones that have the
least amount of rewards received by others.

Let \(N\) be the number of colleagues that you want to reward with bonus points, \(\vec{b}\) is the resulting bonus vector with length \(N\), \(b_0\) denotes the initial amount of points that you want to reward everyone with and finally \(p_i\) denotes the amount of points left in iteration step \(i\) after dividing by the constant \(s \in \mathbb{N}\), which is typically between 2 for few larger prices and 4 for more, albeit smaller, rewards. The computation of the bonus vector is as follows: When giving e.g all colleagues one point, the remaining points is $$p_0 = p_{\rm{total}} - b_0 N$$ Then in the next steps, iterate until no points are left or the maximum number of steps have been taken: $$ \begin{align} b_i &= \left\{ \eqalign{ \left\lfloor \frac{p_{i-1}}{s} \right\rfloor &\qquad b_i > 0 \wedge p_{i-1} > 0\\ 1 &\qquad 0 \leq b_i \leq 1 \wedge p_{i-1} > 0\\ 0 &\qquad p_{i-1} \leq 0 } \right. \\ p_i &= p_{i-1} - b_i \end{align} $$

The second stage is to compute the score to rank the receivers. The score will be based on 2 weights, \(w_1\) which is a random number between zero and one, and \(w_2\) that allows the giver of the points to penalize top ranked receivers that have received already many points from others. The penalize weight \(w_0\) can be chosen by the giver between 0 (no penalty) and 1 for a maximum penalty. So the score for receiver \(j \in N\) is defined as: $$ \begin{align} w_{1,j} &= \mathbb{R} \in [0, 1]\\ w_{2,j} &= 1 - \frac{c_j}{c_{max}}\\ score_j &= \frac{1}{(1 + w_0)}\left( w_{1,j} + w_0 w_{2,j} \right) \end{align} $$

In the final step, the \(\vec{score}\) vector needs sorting in descending order, reindexed and zipped together with the bonus vector \(\vec{b}\), where both vectors have the same length \(N\). With all scores set and assigned to the ranked receivers, the system is ready to send the points to the bonusly service.

Copyright 2018, Gilbert François Duivesteijn, Ava-X GmbH