这是我正在使用的代码:
<?php
$input = array("Test1", "Test1", "Test1", "Test1","Test2");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]];
?>
基本上我想随机回复Test1
和Test2
- 但我希望Test1
显示比Test2
多出4倍。
我猜测通过将它添加到Test2的4倍以上,它应该显示4倍以上 - 代码是正确的还是应该以不同的方式进行?
答案 0 :(得分: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];
答案 1 :(得分:0)
是的,通过在阵列中“Test1”4次和“Test2”1次显示“Test1”的机会是4/5而“Test2”是1/5。这意味着如果你运行100次,你将得到80 Test1和20 Test2。
同样看看这个问题:
答案 2 :(得分: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
在显示时始终是最后一个,因此永远不会显示在您的结果中。
答案 3 :(得分:0)
如果它只是两个值,你可以通过使用php's rand()
随机选择它们并将结果加权以对应你想要的输出来更有效地做到这一点。
您想要{4}的时间"Test1"
和"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,
)
答案 4 :(得分:0)
您的代码将始终以4:1的比例选择。有5次机会,你可以保证获得4个“1”和1个“2”。这真的是你想要的吗?这与多次尝试的4:1比例不同。
您可以拥有array("Test1", "Test2")
。选择0到4之间的索引(五个中的任何一个的机会相等)。如果0到3(小于4),请选择$input[0]
。否则(4),选择$input[1]
。