4 回答
TA貢獻1818條經驗 獲得超11個贊
這是一個類似于 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];
}
}
}
TA貢獻1735條經驗 獲得超5個贊
據我了解,無論您的數組中出現多少次較小的數字,您都希望在 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.5
55 5 10 55 5 55 55 5 55 55
php test.php 2
55 55 10 55 55 55 55 55 55 55
php test.php 1
55 10 55 55 55 55 55 55 55 10
要獲取值,您可以還原數組,55 => [149]然后從隨機獲取結果,然后在還原數組的值中再次隨機獲取
TA貢獻1826條經驗 獲得超6個贊
我認為你實際上可以打亂數組并彈出一個元素,再次打亂并彈出元素,這將是隨機的,那些概率更大的數字將首先出現。
您可以做的是創建另一個包含 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;
}
TA貢獻1831條經驗 獲得超4個贊
現在,你的數組是這樣的: -
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
}
- 4 回答
- 0 關注
- 212 瀏覽
添加回答
舉報
