- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于网站应用程序,我需要随机组成三个一组。用户他/她自己不能对他/她自己进行评分(因此不能成为该组的一部分)。始终至少有 4 个用户。
例如,如果有 5 个用户,我将有一个这样的数组:Array(0,1,2,3,4) 我希望输出为(其中键是用户和数据是 3 人组)。
Array(
[0 : 1,2,3],
[1 : 0,2,4],
[2 : 1,4,3],
[3 : 0,1,4],
[4 : 0,2,3]
);
请注意,该用户从不在该组中,并且每个用户都恰好分配了 3 次。
您不能简单地随机选择用户到组,因为它可能被分配超过 3 次并强制某些组中的用户少于 3 个。
我希望我适本地解释了这个问题并且有人能够提供帮助。
这里有一些代码将三个随机数放入一个字典中,并且对 [0,1,2,3] 工作正常,但是(很可能)对于任何更大的数字都会失败,因为数字不会平均分布(并且会继续永远在 while 循环中,因为没有可能的数字了)。
$rows = range(0,3);
$array_size = count($rows);
$peers_array = Array();
$number_count = array_fill(0, $array_size, 0);
foreach($rows as $index => $row){
$randomNumbers = Array();
for($x = 0; $x < 3; ++$x){
$randomNumber = rand(0, $array_size-1);
while($randomNumber==$index or in_array($randomNumber, $randomNumbers) or $number_count[$randomNumber]>2)
$randomNumber = rand(0, $array_size-1);
$number_count[$randomNumber]++;
$randomNumbers[] = $randomNumber;
}
$peers_array[$index] = $randomNumbers;
}
print_R( $peers_array);
最佳答案
好的,我想出了我自己的解决方案。花了一点时间,但多亏了建议,我才能够想出这个解决方案:
首先它生成从 0 到用户数 - 1 的范围(例如,对于 5,它会给出 [0,1,2,3,4])然后每次之后它都会将列表移动一个(例如 [0 ,1,2,3,4] 变为 [4,0,1,2,3]) 然后它获取数组给定索引处的每个元素并将其放入一个组中(所以如果我只想要 2 个一组会给出 0:[0,4] 1:[0,1] 2:[2,1] 等等...)。然后你在用户数量 - 组的大小之间移动顺序,不要问只相信我。这保证了所有数字出现的次数相同,但顺序仍然是随机的。
下面几行实现了这一点:
function getUsers($user_num, $groups_of){
$index_list = range(0,$user_num-1);
$random_indexes = range(0,$user_num-1);
shuffle($random_indexes);
$groups = array();
foreach($index_list as $user_num)
$groups[] = array($random_indexes[$user_num]);
for($i = 0; $i<($groups_of-1); ++$i){
array_unshift($index_list, array_pop($index_list)); //puts the last element first
foreach($index_list as $index => $user_num)
$groups[$index][] = $random_indexes[$user_num];
}
$shift_number = rand(1, ($len_users-$groups_of));
for($i = 0; $i<$shift_number; ++$i)
array_unshift($groups, array_pop($groups));
return $groups
}
关于php - 如何创建平均分布的三人小组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25336332/
我想为锦标赛的终点分配一组分数,其中第一名获得 10 分,第二名获得 9 分,依此类推。然后我想合并具有相同团队名称的玩家的积分,没有团队(空)的任何人都不会获得积分。然后返回积分最多的队伍名称(te
我是一名优秀的程序员,十分优秀!