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

如何使用PHP将用户随机映射到组中保持组计数相等,php,mysql,random,Php,Mysql,Random,我必须将用户添加到数据库中,但这些用户必须按随机类别分组。 让我们以我的真实情况为例,我有300个用户要添加,并将他们随机映射到3个组(PF、PA和PO)。 我的客户希望随机而非连续地映射这300个用户。 更详细的信息: 假设在任何组中都没有映射的用户。第一个用户将随机映射到PO组 现在我应该: PF - 0 PA - 0 PO - 1 下一个用户可以映射到这3个组中的任何一个组中,只要每个组最多包含2个用户,多于或少于其他两个 最后的地图可以是 PF - 100 PA - 100 PO

我必须将用户添加到数据库中,但这些用户必须按随机类别分组。 让我们以我的真实情况为例,我有300个用户要添加,并将他们随机映射到3个组(PF、PA和PO)。 我的客户希望随机而非连续地映射这300个用户。 更详细的信息: 假设在任何组中都没有映射的用户。第一个用户将随机映射到PO组

现在我应该:

PF - 0 
PA - 0  
PO - 1
下一个用户可以映射到这3个组中的任何一个组中,只要每个组最多包含2个用户,多于或少于其他两个

最后的地图可以是

PF - 100
PA - 100
PO - 100
(理想情况)

或:

或:

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

$map = array(
'PF' => 64,
'PA' => 66,
'PO' => 65
);
理想情况下,下一组应该是介于
PF
PO
我怎样才能在PHP中得到这个

谢谢你的建议!谢谢

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

你的意思是任意的还是随机的?如果你指的是一个随机类别,那么你期望的是分布,基本上是掷骰子来决定哪个类别。如果你的意思是武断,那么答案就完全不同了

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

遵循这种逻辑是没有多大意义的。您所做的工作与按顺序将它们分配到一个类别没有太大区别。您只需信任随机数生成器

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

$categoryIndex = rand(0, 2);

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

假设您有一个名为
users\u groups
的表,它有两列:
user\u id
group
,其中
group
是一个
CHAR(2)
列(用于保存值“PA”、“PF”或“PO”)。执行以下查询:

UPDATE users_groups
SET group=CASE WHERE RAND()<1/3 THEN 'PA' WHERE RAND()<1/2 THEN 'PF' ELSE 'PO' END;
我只是在这里包含一个用户ID值,因为我不知道您对用户有什么样的值

$users
数组进行随机排序:

usort($users, function($a, $b){ return rand()<rand() ? -1 : 1; });
insert\u-into\u-database
只是运行
insert
UPDATE
查询所用方法的简写


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

只需选择一个随机组并将一个用户放在那里。我需要一个脚本来找到在PF和PO之间必须选择的随机组,以保持组数相等。任何一个组都不能比其他组包含2个以上或2个以下的用户。在php中,获取一个用户数组并将其洗牌。然后按照新的随机顺序依次分配它们。我有一个类似于您示例的表,但它还没有数据。在将新用户添加到
users\u表中时,应该用脚本填充它
是的,我的意思是任意的,但不知何故是随机的。我的意思是,如果组顺序是
PF
PA
PO
,首先我在
PF
中有2个用户,在
PA
PO
中有0个用户,我不想映射
PA
中的下一个用户,因为下一个组有可用的“插槽”。我需要在这两组之间随机选择,但我也需要找到这两组是可用的。我想我要做的第一件事是找出这些组中有哪些可用,然后随机拍照。这是我的问题。。如何找出哪些组可用于随机选择?
UPDATE users_groups
SET group=CASE WHERE RAND()<1/3 THEN 'PA' WHERE RAND()<1/2 THEN 'PF' ELSE 'PO' END;
$users = array( 1, 2, 3, ... );
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;
});