簡體   English   中英

如何從數組中獲取一個不那么隨機的值?

[英]How to fetch a not so random value from an array?

這個想法

在工作中,我們有一項任務,沒有人願意做。 所以我嘗試制作一個腳本,從一個數組中隨機選擇一個人並顯示他們的名字。 但是,當我們有實習生時,我們希望他/她比其他人更頻繁地出現。

請記住,這只是代碼的一些愚弄。

<?php
if (!isset($_COOKIE['names'])) {
    // Prepare initial array
    $names = array(
        'John Doe' => 10,
        'Jane Doe' => 10,
        'Mike Doe' => 10,
        'Gina Doe' => 10,
        'Anne Doe' => 10,
        'George Doe' => 10,
        'Jack Doe' => 10,
    );

    // Create cookie
    setcookie('names', serialize($names), time()+28800);
}

$names = unserialize($_COOKIE['names']);

$randomArray = array();
foreach ($names as $name => $probability) {
    if ($probability > 1) {
        foreach (range(1, $probability) as $v) {
            $randomArray[] = $name;
        }
    } else {
        $names[$name] = 10;
    }
}

$selected = $randomArray[array_rand($randomArray)];
if (array_key_exists($selected, $names)) {
    if ($names[$selected] > 1) {
        $names[$selected]--;
    }
    setcookie('names', serialize($names), time()+28800);
    echo $selected;
}

通過查看此代碼,我猜你會得到一般的想法。 通過提高概率,人們的名字會更頻繁地出現。

問題

當概率達到1時,我將其設置為10.但不知何故,這感覺不對。 我不是一個微積分的奇跡,但我的腦袋可以弄清楚這是不對的。 而且,我寫的那段代碼根本沒有效率。 在我看來,循環太多了。

我想問的是,你要看看我的代碼並告訴我它是做錯了什么以及我能做些什么來改進它。 建議等也歡迎。

快速簡便/懶惰的方法是添加更多你想要的人的實例,以增加獲得職責的機會:

$names = array(
    'John Doe',
    'Jane Doe',
    'Mike Doe',
    'Gina Doe',
    'Anne Doe',
    'George Doe',
    'Jack Doe',//intern - 50% of getting selected
    'Jack Doe',
    'Jack Doe',
    'Jack Doe',
    'Jack Doe',
    'Jack Doe',
);
var_dump(array_rand($names));

編輯

所以你的代碼生成了上面的內容,你想簡化它:

$names = array(
    'John Doe' => 1,
    'Jane Doe' => 1,
    'Mike Doe' => 2,
    'Gina Doe' => 3,
    'Anne Doe' => 5,
    'George Doe' => 8,
    'Jack Doe' => 13,
);
$randomNames = array();
foreach($names as $name => $probability) {
    do {
        $randomNames[] = $name;
    } while (--$probability > 0);
}
var_dump($randomNames[array_rand($randomNames)]);

編輯2

我剛剛弄清楚COOKIE正在做什么。 降低每個名字的概率:

session_start();
// instantiate array
$names = array(
    'John Doe' => 1,
    'Jane Doe' => 1,
    'Mike Doe' => 2,
    'Gina Doe' => 3,
    'Anne Doe' => 5,
    'George Doe' => 8,
    'Jack Doe' => 13,
);

// if array exists in session, use that
if(array_key_exists('names',$_SESSION)) {
    $names = unserialize($_SESSION['names']);
}

// Add each name x times where 'x' is the value of $probability
$randomNames = array();
foreach($names as $name => $probability) {
    do {
        $randomNames[] = $name;
    } while (--$probability > 0);
}

// reduce probability by one. If value is less than, or equal to, 0 then reset probability yo 10
$chosen = $randomNames[array_rand($randomNames)];
$names[$chosen]--;
if($names[$chosen] <= 0) {
    $names[$chosen] = 10;
}

// Save array into session for next run
$_SESSION['names'] = serialize($names);

var_dump($chosen,$names);

我假設數組中的數字是概率的權重 - 即使你把它們都設置為10 ...

所以要從你的陣列中進行選擇,你需要......

$weight_total = 0;
foreach ($names as $weight) 
  $weight_total += $weight;

$random_number = rand(1, $weight_total); // Random number between 1 and $weight_total

$running_total = 0;
foreach ($names as $name => $weight) {
  if ($random_number > $running_total && $random_number <= ($running_total + $weight)) {
     echo $name; 
     break;
  }
  $running_total += $weight;
}

然后將實習生的體重設置為高於其他人。

我會選擇一個隨機數來確定它是“小組”還是“窮人實習生”,如果它是“小組”,則另取一個隨機來確定小組中的哪個成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM