v6.3.5 sequential题型 如何把N张图片分成若干组,保证每张图片在每组尽量保持一致

            最近再开发一个版本,也许中间隔了一个春节,导致这版本开发,沉不下心,有点崩溃;其中有个小需求还是有必要整理复盘一下的。

#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元素相同,但排列顺序不同,所以他们也是不同的排列】

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值