话说2015.11.06 ,北京下了第一场雪。16年的今天没下雪,但是雾霾还是不小的,帮媳妇整理她工作时,出现了下面的需求,便想到使用PHP来写程序来进行求解。

【需求】

1. 给出一个平均值X,反过来求出来,得到这个平均值X的三个数X1 ,X2, X3,最大值与最小值的差值要小于0.4(X1-X3都是保留1位小数的数)

2. 这三个数X1, X2, X3代表了三组数。满足下面的公式: X1 = [(m1 - m2)/(m1 - m0) ] * 100 (@1);

m0, m1, m2三个数的边界条件如下:

1)48<m0<51

 2)0.45<m1 - m1<0.55

 3)m1, m2, m3 都是4位的正小数

【实现】 

 根据需求,我想到了使用两个函数来进行处理。

1)一个是已知平均数,求得到这个平均数满足条件的三个数的函数 createX()

 2) 一个是已知X,求满足公式 (@1)和边界条件的三个小数 m0, m1, m2

下面是具体的代码实现,不足之处请指出

<?php

//运行
echo "开始运行 \n";
run();
echo "运行结束 \n"; function run()
{/*{{{*/
$data = array(40.9, 40.5, 44.3, 47.8, 48.5, 42.1, 46.2);
$res = array();
foreach($data as $key)
{/*{{{*/
echo "处理 {$key}\n";
$resX = createX($key);
foreach($resX as $keyX)
{
$keyStr = (string)$key;
$keyXStr = (string)$keyX;
$res[$keyStr][$keyXStr] = createParams4M($keyX);
} }/*}}}*/ error_log(print_r($res,true)."\n", 3, '/tmp/result.log');
var_dump(99999,$res);exit;
return $res;
}/*}}}*/ //1.产生平均数
function createX($ave)
{/*{{{*/
$sum = 3*($ave * 1000);
$x1 = $x2 = $x3 = 0;
$rand4X1X2 = rand(0, 300);
//$x2 > $x1 > $x3;
for($i=0; $i< $ave * 1000 + 550; $i++)
{
$x2 = $i;
$x1 = $x2 - $rand4X1X2;
$x3 = $sum -($x1 + $x2);
$positive = $x1 > 0 && $x2 > 0 && $x3 > 0;
$flag = ($x2- $x3 < 400 && $x2 - $x3 > 200); if($positive && $flag)
{
//echo "捕捉到\n";
$roundX1 = round($x1/1000, 1);
$roundX2 = round($x2/1000, 1);
$roundX3 = round($x3/1000, 1);
$res = array($roundX1, $roundX2, $roundX3);
$flag = $roundX1 != $roundX2
&& $roundX3 != $roundX2
&& $roundX3 != $roundX1;
if($flag)
{
//echo "捕捉到\n";
return $res;
}
}
} echo "Fail 未捕捉到\n";
return array($x1, $x2, $x3);
}/*}}}*/ //2.产生平均数
function createParams4M($aveX)
{/*{{{*/
$begin = 48000;
$end = 51000;
$m0 = $m1 = $m2 = 0;
$rand4M1M2 = rand(450, 550);
$m0 = rand($begin, $end);
$m1 = $m0 + $rand4M1M2;
$m2 = $m1 - (($m1 - $m0)*$aveX/100);
//echo "捕捉到\n";
return array(round($m0/1000, 4), round($m1/1000, 4), round($m2/1000, 4)); }/*}}}*/ ?>

【遇到的问题和不足之处】

1. 【数组key值不能相同】开始遇到的是 得到的平均数的原始三个值有可能有相同的,但是数组中的key是不能相同的,于是做了处理。

同时,key值做了 string的转化

2. 【小数处理】还有就是 因为涉及的是 4位的小数,循环遍历,满足条件输出不方便,就 乘以1000扩大倍数,最后再除以1000还原。

3. 【媳妇新的要求。。】最后就是 因为媳妇的需求还是会变化的,希望我 做成app性质的,这样她可以安装后,自己可以随时使用,

但是对于我这只懂PHP的猿来说,爱莫能助,最多就是 申请阿里云,搭建服务器,根据她变化的需求,服务端修改程序,web访问就不错了,汗

【来自媳妇的需求】PHP实现随机数和方程求解的更多相关文章

  1. 【转】来自《轻松scrum之旅》的敏捷开发总结

    敏捷开发的核心价值观是,软件开发最重要的是给用户提供有价值的.可以工作的软件.如何保证提供有价值的软件,是通过反馈机制来完成的.这一点,我们体会很深.自从采用敏捷开发以后,我们比以前更有意识地希望得到 ...

  2. JavaScript实现生成指定范围随机数和一个包含不重复数的随机数组

    目前JavaScript里面还没有现成的方法可以实现这个简单地需求,我们就需要自己写代码了. 在js中有个函数:Math.random() 这个函数可以生成 [0,1) 的一个随机数. 我们的简单的改 ...

  3. LoadRunner随机数

    需求:自定义随机数 方法: int randomnumber; randomnumber = rand()%+; //100到300的随机数 lr_output_message("ca:%d ...

  4. .NET平台机器学习资源汇总,有你想要的么?

    接触机器学习1年多了,由于只会用C#堆代码,所以只关注.NET平台的资源,一边积累,一边收集,一边学习,所以在本站第101篇博客到来之际,分享给大家.部分用过的 ,会有稍微详细点的说明,其他没用过的, ...

  5. .NET平台机器学习

    .NET平台机器学习资源汇总,有你想要的么? 接触机器学习1年多了,由于只会用C#堆代码,所以只关注.NET平台的资源,一边积累,一边收集,一边学习,所以在本站第101篇博客到来之际,分享给大家.部分 ...

  6. .NET平台机器学习资源汇总,有你想要的么?(转)

    出处:http://www.cnblogs.com/asxinyu/p/4422050.html 阅读目录 1.开源综合类 2.开源.NET平台非综合类 3.其他资源与技术博客 4.我的100篇博客之 ...

  7. 个人对sort()排序方法中比较函数一直很混乱,今日理清

    需求:使用随机数来打印出0-10,并排序. 代码: var a = new Array();var testArray = function() { while (1) { var b = parse ...

  8. LoadRunner录制图片验证码

    LoadRunner录制图片验证码 LoadRunner自身是无法捕获到图片验证码的,但是我们可以帮助LoadRunner来实现验证码的捕获. 1.图片验证码 图片验证码的产生来自服务器端,由服务器生 ...

  9. 常用SQL语句(工作)

    1. 经销商 按店铺交易量汇总 ) from bp_shop_info i left join ( select t.shop_id,sum(t.shop_cost) as summary from ...

随机推荐

  1. linux split 及优化

    split 虽然不好用, 但是还是可以用一下的! 有两个方式拆分, 按固定的行数, 按固定的大小. 默认是 1000 行, 后缀长度为2, 后缀长度N是说, 分片从N个字母/数字 的最小值 到 其最大 ...

  2. com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK assets/com.xx.xx

    完整的Error 信息(关键部分) Error:Execution failed for task ':fanwe_o2o_47_mgxz_dingzhi:transformResourcesWith ...

  3. WCF 安全性 之 Windows

    案例下载 http://download.csdn.net/detail/woxpp/4113172 服务端配置代码 <system.serviceModel> <services& ...

  4. 删除 Windows 旧 OS 加载器

    装过多个系统,然后又删除掉了,系统启动引导时,又把以前的废弃的系统引导给带了出来,试过多种方式,以下方法是最好的. 开始->运行->cmd bcdedit /v 查看要删除的"W ...

  5. SQL中Group By的使用

    1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By All 7.Group By与聚合函 ...

  6. WPF textblock加入超链接

    <TextBlock Grid.Row=" Margin="75,0,0,0"> <Hyperlink Name="BlogHl" ...

  7. Math的三个将小数值舍入为整数方法

    舍入规则: Math.ceil():执行向上舍入,即它总是将数值向上舍入为最接近的整数: Math.floor():执行向下舍入,即它总是将数值向下舍入为最接近的整数: Math.round():执行 ...

  8. 使用wireshark抓包分析浏览器无法建立WebSocket连接的问题(server为Alchemy WebSockets组件)

    工作时使用了Websocket技术,在使用的过程中发现,浏览器(Chrome)升级后可能会导致Websocket不可用,更换浏览器后可以正常使用. 近日偶尔一次在本地调试,发现使用相同版本的Chrom ...

  9. Lasso回归算法: 坐标轴下降法与最小角回归法小结

    前面的文章对线性回归做了一个小结,文章在这: 线性回归原理小结.里面对线程回归的正则化也做了一个初步的介绍.提到了线程回归的L2正则化-Ridge回归,以及线程回归的L1正则化-Lasso回归.但是对 ...

  10. Android随笔之——Android ADB详解

    ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备.它主要有以下几个功能: 1.运 ...