【问题标题】:Randomly selecting from previous randomly selected elements from array PHP从数组 PHP 中随机选择的先前随机选择的元素中随机选择
【发布时间】:2014-08-24 11:25:42
【问题描述】:

首先,我创建了一个由 6 个元素组成的数组。然后我随机选择 4 个很好的元素(我的意思是在随机位置上)。

现在,我想从 4 个非常好的选择中随机挑选 2 个。 如果array1 的值与array2 相同,那么我希望它说非常好。否则,说好。如果值为 0,则为 BAD。

我尝试了所有可能的方法,但都失败了。

这是我最后一次尝试这样做......

$array1 = array();
$array2 = array();
while (count($array1) < 4) {
    $rand = rand(1,6);
    if (!isset($array1[$rand])) {
         $array1[$rand] = TRUE;

    }
}

while (count($array2) < 2) {
    $rand = rand(1,4);
    if (!isset($array2[$rand])) {
        $array2[$rand] = TRUE;


    }
}


$array2 = $array2 + array_fill(1, 4, FALSE);
$array1 = $array1 + array_fill(1, 6, FALSE);

ksort($array1);
ksort($array2);

foreach($array1 as $k => $v){
    if ($v != 0)
{echo "GOOD<br>";}
else {echo "BAD<br>";}}
foreach($array2 as $kc => $vc){
    if ($v2 !=0)
{echo "VERY GOOD<br>";}
else {echo "BAD<br>";}}

这就是它给我的:

GOOD
GOOD
BAD
GOOD
GOOD
BAD
VERY GOOD
BAD
BAD
VERY GOOD

如您所见,它给了我 4/6 的商品,然后是 2/6 的非常好的商品。 我想要的是 4/6 的商品,而从这 4 款中,我想要 2/4 的非常好的商品。

我该怎么做?

提前致谢, 弗拉德

【问题讨论】:

  • $array = $array + array_fill(1, 6, FALSE);?也许$array1 应该在这里?
  • 对不起,我在这里打错了。它在代码中有 $array1...
  • Cannot reproduce, 4/6 和 2/4
  • “无法复制”是什么意思?
  • 当我使用你的代码并对其进行格式化时,我意识到我得到了 4/6 的商品和 2/4 的非常商品,那么问题是什么?

标签: php arrays random


【解决方案1】:

您想要一个大小为 6 的数组,那么为什么要创建多个?您可以以某种方式合并它们,也可以在构建第二个时使用第一个。

但首先,我想指出 while() 循环非常相似,因此应该很容易将其放入 function 并保存一些要编写的代码并拥有一个更易于管理的代码库,如您只需编辑一个位置即可立即生效,而不是多个位置。

现在对于第一个任务,您需要的只是要创建的元素的$number 和$range。此函数将执行您的while() 循环之一加上array_fill()。 (demo)

function fillRandom($range, $num = 1) {
    $data = array_fill($range[0], $range[1]+1, FALSE);

    for ($i=0; $i<$num; $i++) {
        do {
            $key = mt_rand($range[0], $range[1]);
        } while ($data[$key] === TRUE);
        $data[$key] = TRUE;
    }
    return $data;
}

现在是更高级的部分:在第二次运行中,我们可以在 6 个元素的数组中识别出 4 个 TRUE 中的 2 个,方法是给它们另一个 $value(例如)。

在某些情况下需要$data,通过使用$anonymous function,我们可以允许while() 的条件被传递。

function fillRandom($range, $num = 1, $value = TRUE, $data = array(), $anon = NULL) {
    if (empty($data))
        $data = array_fill($range[0], $range[1]+1, FALSE);
    if ($anon === NULL) {
        $anon = function($el) use($value) {
            return $el !== $value;
        };
    }

    for ($i=0; $i<$num; $i++) {
        do {
            $key = mt_rand($range[0], $range[1]);
        } while (isSet($data[$key]) && !$anon($data[$key]));
        $data[$key] = $value;
    }
    return $data;
}

然后你可以做这样的事情 (demo)

$input = fillRandom(array(0, 5), 4);

ksort($input);
print_r($input);

$input = fillRandom(array(0, 5), 2, 2, $input, function($el){
    return $el === TRUE;
});

ksort($input);
print_r($input);

【讨论】:

  • 非常感谢,这正是我想要的!上帝保佑你,先生!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
相关资源
最近更新 更多