3

这是我正在使用的代码:

<?php
$input = array("Test1", "Test1", "Test1", "Test1","Test2");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]];
?>

Test1基本上,我想随机地回声Test2——但我想Test1出现的次数比实际次数多 4 倍Test2

我猜测通过将它添加到 Test2 的 4 倍以上,它应该显示 4 倍以上 - 该代码是正确的还是我应该以不同的方式来做?

4

5 回答 5

0

我猜通过将它添加到 Test2 的 4 倍以上,它应该显示 4 倍以上

这种方法看起来是正确的。让我们测试一下:

$input = array("Test1", "Test1", "Test1", "Test1", "Test2");

for ($i=0; $i < 100000; $i++) { 
    $rand_key = array_rand($input, 1);
    $result[] = $input[$rand_key];
}

$values = array_count_values($result);
print_r($values);

我得到的输出是:

Array
(
    [Test1] => 80123
    [Test2] => 19877
)

4.03094028274次!

尽管在您的示例中,您总是回显$input数组中的第一个元素,因此它根本不是随机的。您需要改为访问$random_keys索引:

$rand_key = array_rand($input, 1);
echo $input[$rand_key];

请注意,我已经更改了array_rand()语句,因此它一次只接收一个值。

这也可以使用shuffle()

$rand_key = shuffle($input);
echo $input[0];
于 2013-11-07T19:16:19.233 回答
0

是的,通过在数组中显示“Test1”4 次和“Test2”1 次,显示“Test1”的机会是 4/5,“Test2”是 1/5。这意味着如果您运行 100 次,您将获得 80 个 Test1 和 20 个 Test2。

也看看这个问题:

在 PHP 中按权重生成随机结果?

于 2013-11-07T19:16:36.120 回答
0

如果我们稍微修改您的代码以在循环中运行:

$input = array("Test1", "Test1", "Test1", "Test1", "Test2");
$results = array("Test1" => 0, "Test2" => 0);

for ($i = 0; $i < 1000; $i++) {
    $rand_keys = array_rand($input);
    $results[$input[$rand_keys]]++;
}

var_export($results);

我得到的结果如下所示:

array (
  'Test1' => 807,
  'Test2' => 193,
)

在我看来,这几乎是我的四倍!

请注意,我已经更改了您的array_rand调用,因此它一次只收到一个结果,否则请查看会发生什么:

$rand_keys = array_rand($input, 2); // get two results 
echo $input[$rand_keys[0]];         // echo the first one

结果按照它们在原始数组中的顺序显示。在这种情况下,这意味着Test2,当它出现时,将永远是最后一个,因此永远不会出现在您的结果中。

于 2013-11-07T19:16:55.043 回答
0

如果只是这两个值,您可以通过使用phprand()随机选择它们并加权结果以对应于您想要的输出来更有效地执行此操作。

你想要"Test1"4/5 的时间和"Test2"1/5 的时间你可以像这样轻松地做到这一点:

echo (rand() > (getrandmax() / 5)) ? "Test1" : "Test2";

您可以通过循环验证这是否正确,正如许多其他答案所做的那样。

for ($ii = 0; $ii < 10000; ++$ii)
  $r[(rand() > (getrandmax() / 5)) ? "Test1" : "Test2"]++; 
var_export($r);

输出

array (
  'Test1' => 8027,
  'Test2' => 1973,
)
于 2013-11-07T19:22:59.817 回答
0

您的代码将始终以 4:1 的比例进行选择。有 5 次机会,您保证获得“1”中的 4 次和“2”中的 1 次。这真的是你想要的吗?这与多次尝试的 4:1 比例不同。

你可以有一个array("Test1", "Test2"). 选择一个介于 0 和 4 之间(包括 0 和 4)的索引(五个中任何一个的机会均等)。如果 0 到 3(小于 4),则选择$input[0]. 否则 (4),选择$input[1]

于 2013-11-07T19:32:05.023 回答