我在计算1000个随机数数组的平均值时遇到了问题。该数组包含1000个介于1和30之间的随机数。
我还希望能够计算数组中每个数字的数量,并在频率分布表中打印每个数字的量。
<script type = "text/javascript">
var arr = [];
function getRandom( num ){
return Math.round(Math.random() * num)+1;
}
for (var i = 0; i < 1000; i++) {
arr.push(getRandom( 30 ));
}
document.write(arr);
document.write("<br/>");
for (var i = 0; i <= 1000; i++){
sum += parseInt(arr[i]);
}
var mean = sum/arr.length;
document.write("The sum of all the elements is: " + sum + " The mean is: " + mean);
</script>
您不必运行两次循环。在飞行中做每件事:
var distrTable = {};
for (var i = 0; i < 1000; i++) {
var rnd = getRandom(30);
sum += rnd;
arr.push(rnd);
if (!distrTable[rnd]) {
distrTable[rnd] = 0;
}
distrTable[rnd]++;
}
现在变量包含以下信息:
arr
—所有随机数。
distrTable
——每个随机数随频率变化。
sum
——所有随机数之和。
jsFiddle示例
顺便说一句,如果你想知道为什么你的代码不工作。。。原因如下:
- 首先定义变量和。循环之前只放入
sum = 0;
- 第二,当数组长1000个项目时,在第二个循环中为您循环1001次。声明应如下:
for (var i = 0; i < 1000; i++) // not i <= 1000;
那么代码应该可以工作了。
代码中的一个小错误是,在第二个循环中,您运行的是元素1001,而不是元素1000。
由于该元素是undefined
,因此它同样导致NaN
和平均值的和。
要修复,请将<= 1000
更改为仅< 1000
您还应该删除parseInt
调用——只有当您的输入值是字符串,但您的数组已经包含数字时,这才是必要的。
生成这样的随机数时要小心:
function getRandom( num ){
return Math.round(Math.random() * num)+1;
}
这个代码可以生成从1到31的数字!这是因为Math.round
——如果Math.random()
生成0.99
,0.99 * 30
将等于29.7
,四舍五入到30
,然后添加1
!
解决方案是用Math.floor
代替Math.round
。