-
慕尼黑8549860
这是一个类似于 GA 中轮盘选择的实现。EReload 的答案版本,但以总和而不是 100 为界。 $a = [ 149 => 55, 130 => 10, 131 => 5, 132 => 5, 133 => 10, 134 => 10, 135 => 5 ]; echo randSelect($a); function randSelect($a) { $values = array_values($a); $sum = array_sum($values); $rand = (rand(0,1000)/1000) * $sum; $partialSum = 0; for ($i=0; $i < count($values); $i++) { $partialSum += $values[$i]; if($partialSum >= $rand){ return $values[$i]; // incase you are using something like array_count_values and are actually looking for the keys // return array_keys($a)[$i]; } } }
-
喵喔喔
据我了解,无论您的数组中出现多少次较小的数字,您都希望在 rand 方法中更频繁地出现更大的数字。您首先需要独特的阵列。权重随机是一种简单的随机方法,但是您可以通过求和权而不是自身来更自由地控制权重。$a = [ 149 => 55, 130 => 10, 131 => 5, 132 => 5, 133 => 10, 134 => 10, 135 => 5 ];$val_arr = array_unique(array_values($a));function rand_by_sum($arr, $power=1){ $sum = 0; $f_val = function($f)use($power){ return pow($f, $power); }; foreach($arr as $f){ $sum += $f_val($f); } $rand = mt_rand(0, $sum); $tmp_sum = 0; foreach($arr as $f){ $tmp_sum += $f_val($f); if($tmp_sum >= $rand) return $f; }}for($i=0; $i< 10; $i++){ echo rand_by_sum($val_arr, $argv[1]) . " ";}echo "\n";这里有一些不同 pow 的测试结果php test.php 0.555 5 10 55 5 55 55 5 55 55 php test.php 255 55 10 55 55 55 55 55 55 55 php test.php 155 10 55 55 55 55 55 55 55 10要获取值,您可以还原数组,55 => [149]然后从随机获取结果,然后在还原数组的值中再次随机获取
-
跃然一笑
我认为你实际上可以打乱数组并弹出一个元素,再次打乱并弹出元素,这将是随机的,那些概率更大的数字将首先出现。您可以做的是创建另一个包含 100 个数字的数组,表示总概率,并在其中插入与其值相等的数字数量,最后您将其打乱以稍后随机选择一个索引。然后你会得到一个包含 100 个数字的数组,其中重复次数最多的数字是最有可能的。最后,您只需要选择一个随机索引并创建您的数组。你能告诉我你是在寻找这样的东西还是我误解了这个问题function getProb($array, $elements){ $myNewArray = []; $myProbabilisticArray = $this->getProbabilisticArray($array); for ($i=0; $i < $elements; $i++) { $myNewArray[] = $myProbabilisticArray[array_rand($myProbabilisticArray)]; } return $myNewArray;}function getProbabilisticArray($array) { $myNewArray = []; rsort($array); $currentProbability = 0; $accumulatedProbability = $array[0]; $currentPosition = 0; while ($currentProbability < 100) { if ($currentProbability > $accumulatedProbability) { $currentPosition++; $accumulatedProbability += $array[$currentPosition]; } array_push($myNewArray, $array[$currentPosition]); $currentProbability++; } shuffle($myNewArray); return $myNewArray;}
-
慕容708150
现在,你的数组是这样的: -55, 10, 5, 5, 10, 10, 5现在,您应该生成一个介于 [0, 100) 之间的随机数,我们称之为r。现在,如果r介于 [0, 55) 之间,请选择值 55。否则,如果r介于 [55, 55 + 10 = 65) 之间,则选择值 10。否则,如果r介于 [65, 65 + 5 = 70) 之间,则选择值 5。否则,如果r介于 [70, 70 + 5 = 75) 之间,则选择值 5。否则,如果r介于 [75, 75 + 10 = 85) 之间,则选择值 10。否则,如果r介于 [85, 85 + 10 = 95) 之间,则选择值 10。否则,如果r介于 [95, 95 + 5 = 100) 之间,则选择值 5。我相信你会明白的......所以,对于一般情况,如果你有一个名为“arr”的数组,这是伪代码: -function SELECTPROB(){ $r = generateRandomNumber(0, 100); //function to generate random number between 0 and 100, (100 exclusive) $sum = 0; foreach($arr as $i) { if($r >= $sum && $r < $sum + $i) { return $i } $sum = $sum + $i } return -1 //Should technically never reach upto this, but it can if your probability's sum is not 100}