I had the same problem: https://stats.stackexchange.com/questions/178991/sampling-from-a-probability-list-set-efficiently. In other words: Given a set where each item has a probability and whose items' probabilities sum up to one. I want to draw a series of items efficiently, i.e. without sorting anything and without repeatedly iterating over the set.

The following function draws the lowest of $N$ uniformly distributed random numbers within the interval $[a,1)$. Let $r$ be a random number from $[0,1)$.

\begin{equation}
\text{next}(N, a) = 1 - (1 - a) \cdot \sqrt[N]{r}
\end{equation}

You can use this function to draw an **ascending** series $(a_i)$ of $N$ uniformly distributed random numbers in [0,1). Here is an example with $N = 10$:

$a_1 = \text{next}(10, 0)$  
$a_2 = \text{next}(9, a_1)$  
$a_3 = \text{next}(8, a_2)$  
$\dots$  
$a_{10} = \text{next}(1, a_9)$

Now while drawing that ascending series, parallel iterate over your set. For each drawn ascending random number, add the corresponding set item to your result.

----

If you are interested in the $\text{next}$ function: It is the inverse of the probability that one of $N$ uniformly distributed random numbers lies within the interval $[a, x)$ with $x \leq 1$.