Probabilistic Chooser

In the common Internet context of listing dynamic content that users are voting for, one encounters users gaming the ranking system by seeing who gets first, or unrecognized but good content content hiding below the popular content.

The solution is to give a weighted listing where each item is chosen proportional to its vote. This technique will prevent positive feedback loops that raise popular items forever above the rest (due to limitations of people's attention span to scan all contributions or positions). It's based on evolutionary theory (and has been used in a GeneticAlgorithm for selecting from a pool of ranked genes between generations). The idea is for every contribution, tally a count of all votes, then each contribution gets weighted from this total and an intelligent throw is made to pick a given item, as follows.

If given these item/vote pairs, for example:

That is a sum total of 25 votes.

The probability of being shown first becomes, respectively:

Totaling, as expected: 1.0 (or 25/25)

Next, take those numbers and accumulate them thusly:

Now, throw a random number [0.0,1.0) and pick the element that is between those results.

Bingo! Problem solved! Over time, under-valued contributors will get moved upward -- no positive reinforcement loops! [Edit: I need to re-write this for integer values and where items can't be selected more than once.] (Algorithm licensed: CC-BY-NC, CreativeCommons)

-- MarkJanssen

Just throw a random integer [0,25] (in this case) and pick the element that is between the result and not worry about rounding.


This topic could use some context. What alternative is it improving over? What's it for?

Google, for example, could use it to display search results so people don't "game the system" with SearchEngineOptimization?. OR http://quora.com could use it to display all the answers for people to vote for, rather than have the first few values getting all the attention.

Getting different results each time is going to drive users and testers crazy.


EditText of this page (last edited November 26, 2014) or FindPage with title or text search