I have a map of users and a count of entries/tickets they have purchased for a raffle (or lottery or any other similar event).
The map of users to entries is in the structure as seen below:
// Map the person to the amount of entries they have purchased
$entries = [
'Adam' => 5,
'James' => 3,
'Oliver' => 4,
'Holly' => 8
];
I want to choose a random user but take into consideration their chance based on ticket count. The probability of winning must be:
(User Ticket Amount / Total Ticket Count) * 100 = Probability percentage
For example, from the test array the expected results is Holly will win the raffle 8 times out of 20 times.
It's a coincidence you are asking this as I created a method to do just this the other day when writing a script for a betting site.
Please see the comments for explanation of what the code consists of:
// The array passed to the function should be your $entries array
function randProb(array $items) {
$totalProbability = 0; // This is defined to keep track of the total amount of entries
foreach ($items as $item => $probability) {
$totalProbability += $probability;
}
$stopAt = rand(0, $totalProbability); // This picks a random entry to select
$currentProbability = 0; // The current entry count, when this reaches $stopAt the winner is chosen
foreach ($items as $item => $probability) { // Go through each possible item
$currentProbability += $probability; // Add the probability to our $currentProbability tracker
if ($currentProbability >= $stopAt) { // When we reach the $stopAt variable, we have found our winner
return $item;
}
}
return null;
}
Any questions feel free to ask below, if you would like to output the value (probability) of the winning item, return $probability
at the breakpoint instead of $item
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With