我必须将用户添加到数据库中,但这些用户必须按随机类别分组。假设我的真实情况,我有 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
);
理想情况下,下一组应该是PF
和PO
之间的随机 我怎样才能在 PHP 中得到这个?
我感谢任何建议!谢谢!
如果用户已经在数据库中,一个简单的方法是:
假设您有一个名为 users_groups
的表,其中包含两列:user_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;
这将把每个用户分配到三个组中的一个,数量大致相等。
如果需要,可以设计另一个查询来调整组中的相对数字。
顺便说一句,我一直看到关于SO的问题,人们说"我希望它是随机的,但我想要这个的x和那个的y"——如果是这样的话,那么它就不是随机的。您正在限制分发。
编辑:好的,根据您的评论,这是一个解决方案:
假设您有一组用户:
$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
只是用于运行INSERT
或UPDATE
查询的任何方法的简写。
由于用户列表是随机排序的,因此给定用户分配到的组将是随机的。并且由于组是按顺序分配的(首先是 PA,然后是 PF,然后是 PO,然后是 PA,等等),因此每个组中的用户数将相等(或者如果用户计数不能被 3 整除,则尽可能相等)。
我必须将用户添加到数据库中,但这些用户必须按随机类别分组。
你的意思是任意的还是随机的?如果你的意思是随机类别,那么你期待分布,基本上是掷骰子来决定哪个类别。如果你的意思是任意的,那么答案就完全不同了。
理想情况下,下一组应该是 PF 和 PO 之间的随机组 我如何在 PHP 中得到这个?
遵循这个逻辑没有多大意义。您所做的与按顺序将它们分配到一个类别没有太大区别。您应该简单地信任随机数生成器。
当您掷骰子时,您有 1/6 的机会获得任何数字。您下一次滚动的结果与以前的滚动无关。
$categoryIndex = rand(0, 2);