我必须将用户添加到数据库中,但这些用户必须按随机类别进行分组。 假设我的真实案例,我有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得到它?
我感谢任何建议!谢谢!
答案 0 :(得分:0)
我必须将用户添加到数据库中,但这些用户必须按随机类别进行分组。
你的意思是任意还是实际上是随意的?如果你的意思是一个随机的类别,那么你期待分配,并且基本上掷骰子来决定哪个类别。如果你的意思是任意的,那么答案是完全不同的。
理想情况下,下一组应该是PF和PO之间的随机组我怎么能在PHP中得到这个?
遵循这种逻辑并不会有很多意义。除了将它们按顺序分配到类别之外,您没有太大的不同。您应该只信任随机数生成器。
当你掷骰子时,你有1/6的机会获得任何数字。下一次滚动的结果与之前的滚动无关。
$categoryIndex = rand(0, 2);
答案 1 :(得分:0)
如果用户已经在数据库中,那么一个简单的方法就是:
想象一下,您有一个名为users_groups
的表格,其中有两列:user_id
和group
,其中group
是CHAR(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
只是您用于运行INSERT
或UPDATE
查询的任何方法的简写。
由于用户列表已随机排序,因此指定给定用户的组将是随机的。并且因为按顺序分配组(首先是PA,然后是PF,然后是PO,然后返回到PA等),每个组中的用户数量将相等(或者如果用户数量不同,则尽可能相等)可被3整除。