最近再开发一个版本,也许中间隔了一个春节,导致这版本开发,沉不下心,有点崩溃;其中有个小需求还是有必要整理复盘一下的。
#sequential 小算法
需求:P1-P6一共6张图片,100人来答题,每次随机获取3张图片进行随机排列,保证每张图片在第1位置和第2位置以及第3位置,显示的数量大概相同;
思考:数据库考虑:
代码:
<?php
/*
*@function:随机+均匀分布
*@author:今日头条关注【琅琊才俊】
*@date:2019/2/21
*/
$default = [];
#默认每次随机获取3张
$random = 3;
#样本量默认100人
$sample_size = 100;
#默认有6张图片
$m = [1=>1,2=>1,3=>1,4=>1,5=>1,6=>1];
#初始化每张图片在每个位置的初始值
for($i=1;$i<=$random;$i++){
foreach($m as $k=>$v){
$default['图片位置'.$i][$k] = 1;
}
}
for($A=0;$A<$sample_size;$A++){
$not_select = [];
foreach($default as $key=>$value){
#随机获取数组中最小值
$min = min($value);
$new_arr = [];
#从中选出权重最小的
foreach($value as $k=>$v){
#第一次选中的第二次将不再被选中
if($min == $v && !in_array($k,$not_select)){
$new_arr[$k] = $k.'次';
}
}
#每个位置从权重最小的中随机抽取一张图片
$rand_min_key = array_rand($new_arr,1);
#被选中的图片将不再列入下次抽取中
$not_select[] = $rand_min_key[0];
#被选中的图片权重+1,下次将不再不选中
$default[$key][$rand_min_key]++;
}
}
echo "<pre>";
print_r($default);
die;
?>
#打印结果
Array
(
[图片位置1] => Array
(
[1] => 18
[2] => 18
[3] => 17
[4] => 18
[5] => 18
[6] => 17
)
[图片位置2] => Array
(
[1] => 17
[2] => 18
[3] => 18
[4] => 18
[5] => 17
[6] => 18
)
[图片位置3] => Array
(
[1] => 17
[2] => 18
[3] => 18
[4] => 17
[5] => 18
[6] => 18
)
)
组合:从n个中不同元素取出m个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数;
排列:从N个元组中选择m个不同元素的所有排列的个数,成为排列种树或排列列数;【当且仅当两个排列的元素完全相同,且元素的排列顺序也相同,则两个排列相同,例如:abc与acb的元素不完全相同,他们是不同的排列,abc与acb元素相同,但排列顺序不同,所以他们也是不同的排列】