【问题标题】:random shuffle in php?php中的随机洗牌?
【发布时间】:2011-08-30 09:01:45
【问题描述】:

我正在创建一个彩票来配对人们。所以我想要一种方法来洗牌数组中的字符串,其中没有项目最终在同一个地方。 (你不能和自己配对)

    public function shuffleSantas(){
    $query = $this->db->get('person');
    $givers = array();
    $recievers = array();
    foreach($query->result() as $row):          
        $givers[] = $row->name;
        //here i want a random order, but no name can be on the same place as in $givers!
        $recievers[] = '';
    endforeach;

【问题讨论】:

  • 也许你可以让 1 个大数组对其进行 shuffle() 并将其分成两半?
  • 你可能想看看array_rand()

标签: php random shuffle


【解决方案1】:

将数组洗牌一次,然后将第一个元素与第二个元素配对,将第二个元素与第三个元素配对,以此类推,最后一个元素与第一个元素配对。

【讨论】:

  • 这种方法并不能保证单个元素不会与自身配对。
  • 非常优雅的解决方案! (也稍作编辑以便能够投票,就像@J0HN 我认为这是错误的)
【解决方案2】:
$src = $query->result();
$givers = array();
$receivers = array();
foreach ($src as $idx=>$first_person){
    $count = 0; //infinite loop guard
    do{
        ++$count;
        $sec_idx = rand(0,count($src)-1);
        $second_person = $src[$sec_idx];
    } while ($second_person==$first_person && $count<5); 
    $givers[] = $first_person;
    $receivers[] = $second_person; 
}

在这种情况下,一个人将能够从一个人那里获得并给予另一个人。可以吗?而且这个算法也不是最优的,如果数组中只有一个人,肯定会陷入无限循环。

【讨论】:

  • 当结果为奇数时会发生什么?
  • 我想你错了:每个人都是一个给予者一个接受者。使用你的功能,有多少人就有多少礼物。而且人数是奇数,一个人不会有任何礼物。
  • @Clement 更新了一点,总是在do ... while 循环中混合该条件。 @Vince 完全重写了代码,现在它确实可以工作了。
【解决方案3】:

如果认为 PHP 中没有内置函数可以这样洗牌。您必须编写自己的函数。

【讨论】:

  • 确实,但是这个问题似乎太“请给我代码”以提出更好的答案,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2016-04-26
  • 1970-01-01
  • 2010-12-03
  • 2011-05-05
相关资源
最近更新 更多