Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

किसी घटना का यादृच्छिक भारित चयन

ऐसा करने के दो तरीके, जिनके बारे में मैं अपने सिर के ऊपर से सोच सकता हूं:

विकल्प 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;
}

नीचे टिप्पणी में हमारी बातचीत के बाद, यहां कोड के साथ एक पास्टबिन है:

http://pastebin.com/bLbhThhj



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql 12 घंटे से 24 घंटे का समय रूपांतरण

  2. MySQL डेटाबेस को एक सर्वर से दूसरे सर्वर में आयात करना

  3. SQL अनेक से अनेक का चयन करें

  4. डब्ल्यूएएमपी सर्वर। MySQL में बहुत बड़ी डेटा निर्देशिका?

  5. MySQL एक सरणी में विशिष्ट JSON ऑब्जेक्ट को अपडेट करता है