如何使用PHP随机将用户映射到组中,保持组计数的相等性

时间:2014-04-03 22:54:58

标签: php mysql random

我必须将用户添加到数据库中,但这些用户必须按随机类别进行分组。 假设我的真实案例,我有300个用户添加并随机地将它们映射到3组(PF,PA和PO)。 我的客户想要随机地连续映射这300个用户。 更详细: 假设在任何组中都没有映射用户。第一个用户将被随机映射到PO组。

现在我应该:

PF - 0 
PA - 0  
PO - 1

下一个用户可以映射到这3个组中的任何一个,只要每个组最多可包含2个用户,而不是其他两个用户。

最终地图可以是

PF - 100
PA - 100
PO - 100

(理想情况)

或:

PF - 98
PA - 100
PO - 102

或:

PF - 101
PA - 101 
PO - 98 

现在,假设我在PHP中有以下数组

$map = array(
'PF' => 64,
'PA' => 66,
'PO' => 65
);

理想情况下,下一组应该是PFPO之间的随机组 我怎么能用PHP得到它?

我感谢任何建议!谢谢!

2 个答案:

答案 0 :(得分:0)

  

我必须将用户添加到数据库中,但这些用户必须按随机类别进行分组。

你的意思是任意还是实际上是随意的?如果你的意思是一个随机的类别,那么你期待分配,并且基本上掷骰子来决定哪个类别。如果你的意思是任意的,那么答案是完全不同的。

  

理想情况下,下一组应该是PF和PO之间的随机组我怎么能在PHP中得到这个?

遵循这种逻辑并不会有很多意义。除了将它们按顺序分配到类别之外,您没有太大的不同。您应该只信任随机数生成器。

当你掷骰子时,你有1/6的机会获得任何数字。下一次滚动的结果与之前的滚动无关。

$categoryIndex = rand(0, 2);

答案 1 :(得分:0)

如果用户已经在数据库中,那么一个简单的方法就是:

想象一下,您有一个名为users_groups的表格,其中有两列:user_idgroup,其中groupCHAR(2)列(用于保存值& #39; PA',' PF'或' PO')。执行以下查询:

UPDATE users_groups
SET group=CASE WHERE RAND()<1/3 THEN 'PA' WHERE RAND()<1/2 THEN 'PF' ELSE 'PO' END;

这将把每个用户分配到三个组中的一个,大致相同的数量。

如果需要,您可以设计另一个调整组中相对数字的查询。

顺便说一句,我总是在人们说'#34;我希望它是随机的,但我想要 x 这个和 y < / em>那个&#34; - 如果是这样,那么它不是随机的。你限制了分发。

修改:好的,根据您的评论,这是一个解决方案:

假设您有一组用户:

$users = array( 1, 2, 3, ... );

我在这里只包含用户ID值,因为我不知道您为用户提供了哪种值。

随机排序$users数组:

usort($users, function($a, $b){ return rand()<rand() ? -1 : 1; });

逐步浏览用户并逐个应用这些群组:

$groups = array( 'PA', 'PF', 'PO' );
$i = 0;
array_walk($users, function($u) use(&$i, $groups){
    insert_into_database($u, $groups[$i++]);
    if($i==count($groups))
        $i=0;
});

insert_into_database只是您用于运行INSERTUPDATE查询的任何方法的简写。

由于用户列表已随机排序,因此指定给定用户的组将是随机的。并且因为按顺序分配组(首先是PA,然后是PF,然后是PO,然后返回到PA等),每个组中的用户数量将相等(或者如果用户数量不同,则尽可能相等)可被3整除。