一个正态分布应用题题

  最近几天顶着上海40&的凉爽天气找工作,心里是开心的不要不要的,每次面试都是要坐那里出半天汗才能回过神来,感觉到了这个世界对我深深的爱意,言归正传,面试过程中碰到了几次笔试,其中有这么一道题,由于实际工作中没遇到过,所以留意下来,题目是这样:
  有一个数组为:var arr = [1,2,1,3,3,2,4,6,3],通过处理将其变为正态分布的形式: [1,2,3,3,6,4,3,2,1]。
  关于正态分布可以查看此链接:http://baike.baidu.com/link?url=OWbFf2pyVh3s5stnYYRdaqcwjg5-Fo4WRp1hYDR94WK9aUNsduaGoNmV4mtfhLLPRMkf2A2GzpTBfKjyypiojK,不知道怎么搞得编辑器里插入链接无法用,只能这样发了,懒得看的同学我就简单解释一下吧,其实看到处理后的数组大致也能明白,就是两头小,中间大,体现到坐标轴里的正态曲线呈钟型,两头低,中间高,左右对称因其曲线呈钟形,因此人们又经常称之为钟型曲线。
  这道是面试的最后一题,做到这里的时候时间比较紧张了加上天气炎热口渴饥饿前台妹子太好看(别废话了就是因为算法弱。。。),稍作思考写了如下代码:
var arr = [1,2,1,3,3,2,4,6,3]
~(function(arr) {
var temp = [], i = 0, l = arr.length,
sortArr = arr.sort(function(a,b){return a-b}) //先将数组从小到大排列得到 [1, 1, 2, 2, 3, 3, 3, 4, 6]
for (;i&l;i++){
if(i%2==0){
temp[i/2] = sortArr[i]
// 下标为偶数的顺序放到前边
temp[l-(i+1)/2] = sortArr[i] // 下标为奇数的从后往前放
console.log(temp) // [1, 2, 3, 3, 6, 4, 3, 2, 1] 看起来挺完美哈
  由于是笔试,自己在脑海里边yy了一会程序后,觉得没啥大问题就交卷了,后来的面试官看了试卷,在面试过程中并没有提到这道题,所以觉得这种方法没什么问题了就没在面试过程中再问,不过来回来的路上,我突然想到了一个这样的情况:
var arr = [1,2,3,4,5,6,7,8,9] // 一个规则递增的数组
~(function(arr) {
var temp = [], i = 0, l = arr.length,
sortArr = arr.sort(function(a,b){return a-b})
for (;i&l;i++){
if(i%2==0){
temp[i/2] = sortArr[i]
temp[l-(i+1)/2] = sortArr[i]
console.log(temp) //[1, 3, 5, 7, 9, 8, 6, 4, 2] 问题出现了。。
  是的,这样一来这个数组的左右部分并不是对称的,以9为中心,左侧为1+3+5+7=16,右侧为2+4+6+8=20,明显的是左轻右重,不是一个均匀的正态分布了,随着数组的增大,带来的问题会越来越严重。
  亚麻带。。。。我是一朵含苞欲放的花骨朵不要这样对我。。。
  看来前边的代码是不能用的,只能重新思考解决方法,其实问题的核心在于保证数组的左右两侧是相等或者大致相等的,不管是奇数个数的数组还是偶数个数的,数组可以分为两部分(奇数个数的抛去最大值后也可以看做是一个偶数数组,即便有多个相同最大值也无所谓,从小到大排序后去除最后一个即可),还是按照上边的方法,下标为偶数的时候放到左侧,为奇数的时候放到右侧,在左右两边的数组增长过程中,当数组长度相等的时候,对左右两侧数组之和进行比较,因为是按照从小到大排列的,所以正常情况下,右侧会大于左侧,然后将右侧第一个跟左侧最后一个互换一下即可达到平衡的目的,代码如下:
1 var arr = [1,2,3,4,5,6,7,8,9],
sortArr = arr.sort(function(a,b){return a-b}),
l = arr.length,
temp_left = [], temp_right = []
function sort(arr){
for(;i&l;i++){
var eq = sortArr[i]
i%2 == 0 ? temp_left.push(eq) : temp_right.unshift(eq)
if(i & 1){
if( temp_left.length == temp_right.length && !compare(temp_left, temp_right)){
wrap(temp_left,temp_right) //数组相等并且右侧和大于左侧的时候进行交换
return temp_left.concat(temp_right)
// 数组求和
function sum(arr) {
return eval(arr.join("+"));
// 数组比较大小
function compare(arr1,arr2) {
return sum(arr1) &= sum(arr2)
// 左边最后一个跟右边第一个交换
function wrap(l,r){
var m = r.shift()
r.unshift(l.pop())
console.log(sort(arr)) // 得到 [1, 4, 6, 7, 9, 8, 5, 3, 2]
  这样一来整个正态分布就均匀多了,多做几组测试看看效果:
arr = [1,333,444,555,66,]
console.log(sort(arr)) /[1, 444, 909, , 333, 66]
arr = [168.6,177.5,174.2,189.3,167.2,177.6,167.8,175.5]
console.log(sort(arr)) //[167.2, 174.2, 175.5, 189.3, 177.6, 177.5, 168.6, 167.8]
  看起来还不错,在百度资料的过程中还查到一篇这样的文章,链接是&http://www.lai18.com/content/524601.html,貌似用c++完成的,不过看到文章最后的结果,并不是一个均匀的正态分布,倒是跟我第一个程序差不多,
本人不怎么会c++,也没运行多组结果看看,有兴趣的同学可以尝试下作为对比。
&  本文所有的程序我仅在chrome做过测试,如果其他浏览器有问题的话,希望留言告知,其实这东西也没什么难度,权当一个记录吧,有需要的时候可以用用。
阅读(...) 评论()你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
对于一组共28 个数据进行正态性检验。使用MINITAB 软件,先后依次使用了“Anderson-Darling”,“Ryan-Joiner(Similar to Shapiro-Wilk)”及“Kolmogorov –Smirnov”3 种方法,但却得到了3
种不同结论:
“Anderson-Darling”检验p-value&0.005 因而判数据“非正态”, “Ryan-Joiner(Similar to
Shapiro-Wilk)” 检验p-value&0.10 以及“Kolmogorov –Smirnov” 检验p-value&0.15 都判数据
“正态”。这时候正确的判断是:
A. 按少数服从多数原则,判数据“正态”。
B. 任何时候都相信“最权威方法”。在正态分布检验中,相信MINITAB 软件选择的缺省方法
“Anderson-Darling”是最优方法,判数据“非正态”。
C. 检验中的原则总是“拒绝是有说服力的”,因而只要有一个结论为“拒绝”则相信此结果。
因此应判数据“非正态”。
D. 此例数据太特殊,要另选些方法再来判断,才能下结论。
不知道那就B吧:lol:
25 个回复,游客无法查看回复,更多功能请或
扫一扫微信订阅
浏览: 6560
关注: 0 人
6SQ质量日刊
服务号: Lsqdnet
6SQ质量周刊正态分布题目_百度知道
正态分布题目
态布题目要减1
我有更好的答案
前面绝值符号
有绝对值符号就要减1?有绝对值符号不是代表2倍了么?
阴影部分不就是p么?用大的0.06减去小的-0.06,为什么减去1呢?不懂
懂了,谢谢。
采纳率:38%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。4被浏览113分享邀请回答11 条评论分享收藏感谢收起

我要回帖

更多关于 正态分布例题 的文章

 

随机推荐