我一直在研究这段代码,目标是整理数组中的数字,然后找到中位数。我的中位数没有正确输出,当我尝试只查看数组 [0] 中的内容时,它永远不会有正确的值。我不确定我在哪里搞砸了。
法典:
var array = [];
window.onload = function (){
var answer = '';
var median = 0;
for (var i = 0; i < 8; i++) {
var rand = Math.floor(Math.random() * 101);
array.push(rand);
array.sort(function(a, b){return a-b});
answer = answer + array[i] + " ";
}
median = ((array[3] + array[4]) /2);
document.getElementById("result").innerHTML = answer + "<br />" + median;
}
我建议首先移动你的循环结尾。目前,每次向数组添加新数字时,您都会进行排序。这意味着两件事:你浪费了计算能力在你应该只做一次的事情上,当你在行中"记录"你的结果时,answer = answer + array[i] + " ";
它不断变化,因为顺序在变化。您的函数逻辑是正确的,因此通过进行下面的更改,您应该得到所需的结果。
var array = [];
window.onload = function (){
var answer = '';
var median = 0;
//Loop is simplified to just push a random value
for (var i = 0; i < 8; i++) {
array.push(Math.floor(Math.random() * 101));
}
//Sort is outside of the loop;
array.sort(function(a, b){return a-b});
//Median is outside of the loop
median = ((array[3] + array[4]) /2);
//answer is outside of the loop (if you don't know reduce look at the link below)
answer = array.reduce( function ( answer , value ) {
return answer + ',' + value;
} );
// put into the dom
document.getElementById("result").innerHTML = answer + "<br />" + median;
}
如果您需要这方面的帮助,请随时给我发消息,也可以查看减少的文档 这里.
使用纯粹的SO帖子,我想出了一个解决方案。
- 策略
- 洗牌
起初,部分表达式(Math.floor(Math.random() * 101))
想出了重复项,这就是弱酱。Fisher-Yates(又名Knuth)Shuffle有一个优秀的算法。
您的var answer
和reduce
表达式现在已按照@hyphnKnight解释进行组合并脱离循环。没有必要进一步分解它,因为减少回报是显示排序数组所需的一切。我也用unshift
代替push
,我读到使用数组的前面比后面更快,但你无法分辨出区别,功能太小了。
片段
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>35469092</title>
</head>
<output id="result"></output>
<body>
<script>
// 1. Populate an array with the numbers 1 through 100.
var arr = [];
for(var i = 1; i <= 100; i++) {
arr.unshift(i);
}
median(arr);
function median(arr){
var median = 0;
// 2. Shuffle
var ran100 = shuffle(arr);
var ran8 = [];
for(var j = 0; j < 8; j++) {
// Take the first 8 elements of the resulting array.
ran8.unshift(ran100[j]);
}
var answer = ran8.sort(function(a, b){return a-b});
median = ((ran8[3] + ran8[4]) /2);
document.getElementById("result").innerHTML = answer + "<br />" + median;
}
function shuffle(arr) {
var curIdx = arr.length, tmpVal, randIdx;
while (0 !== curIdx) {
ranIdx = Math.floor(Math.random() * curIdx);
curIdx -= 1;
tmpVal = arr[curIdx];
arr[curIdx] = arr[ranIdx];
arr[ranIdx] = tmpVal;
}
return arr;
}
</script>
</body>
</html>