ऐसा करने के दो तरीके, जिनके बारे में मैं अपने सिर के ऊपर से सोच सकता हूं:
विकल्प 1:डेटा के सेट से प्रमुख मानों के साथ एक नया सरणी भरें, जहां वजन निर्धारित करता है कि किसी आइटम को कितनी बार दोहराया जाता है। इस सरणी में अनुपात तब भारित वितरण से मेल खाता है। बस $arr[array_rand($arr)]
. का उपयोग करके हड़प लें . जबकि सरल और समझने में आसान, यह आपके चेहरे पर विस्फोट कर देगा यदि बहुत सी चीजें हैं, या यदि वजन मान वास्तव में अधिक है।
$weighted = array();
foreach($items as $item) {
array_merge($weighted, array_fill(0, $item['weight'], $item['value']);
}
$result = $weighted[array_rand($weighted)];
विकल्प 2. भार का योग करें। 0 और योग के भार के बीच एक यादृच्छिक संख्या चुनें। डेटासेट में तत्वों पर लूप करें, आपके द्वारा चुनी गई यादृच्छिक संख्या से तुलना करें। जैसे ही आप रैंडम इंडेक्स के बराबर या उससे बड़ा हिट करते हैं, उस तत्व को चुनें।
function findRandomWeighted(array $input) {
$weight = 0;
// I'm assuming you can get the weight from MySQL as well, so this loop really should not be required. In that case $weight becomes a parameter.
foreach($items as $item) {
$weight += $item['weight'];
}
$index = rand(1, $weight);
foreach($items as $item) {
$index -= $item['weight'];
if($index <= 0) { return $item['value'] }
}
return null;
}
नीचे टिप्पणी में हमारी बातचीत के बाद, यहां कोड के साथ एक पास्टबिन है: