为什么写这个文章源头:
- 做力扣题的时候被屈辱了,突然忘了Math.floor(Math.random()10)+10,就是Math.random()得到一个0-1的随机数(小数也包括)然后10,也就是得到一个0-10的随机数,Math.floor向下取整不超过这个数的最大整数,(说白了就是取这个数的整数,不要小数部分)
然后加上10,也就是10-20的一个整数
废话不多说,话说张哥直接开讲
基础数学对象Math属性值
数学对象Math之方法(取最大, 最小值)
- Math
对象还包含许多方法,用于辅助完成简单和复杂的数学计算。其中min()和max()方法用于确定一组数值中的最小值和最大值。这两个方法都可以接收任意多个数值参数
let min=Math.min(2,34,2,1)
let max=Math.max(2,34,2,1)
console.log("最小值是:",min);
console.log("最大值是:",max);
那么我们想想是不是可以用来求数组的最大值最小值?
let arr=[12,2,1,3]
let max=Math.max(arr)
console.log(max);
Math.max()里边不能传入数组,但是数组就比我们平时传入的参数多了两个[ ],我们会想到apply(调用对象,数组参数[])但是最后传入的是数组参数是去掉方括号后里边的内容,不正是我们想要的吗?
let arr=[12,2,1,3]
let max=Math.max.apply(null,arr)
console.log(max);
我刚开始想这个问题的时候,直接想的是把方括号去掉,用正则表达式,离谱了就跑远了。。这个方法多好哈哈哈,我low了
数学对象Math之方法(取整)
Math.floor():向下取整,不超过其最大整数(就是取一个数的整数部分)
Math.ceil():向上取整,超过其最小整数(就是一个数字的整数部分+1)
Math.round():四舍五入
不再演示了,看一眼记住用即可
数学对象Math之方法(取随机数)
Math.random()方法返回大于等于0 小于1 的一个随机数
改装一下,改成任意两个数字之间的随机数
function randomAB(min,max){
return Math.random()*(max-min)+min;
}
上图解释一下
继续改装,改成任意两个数字之间的整数
function randomIntAB(min,max){
return Math.floor(Math.random()*(max-min)+min);
}
看起来很简单对不对?但是这是我们自己很默认的把输入的两个任意数字取了3,4这样有间距的,如果取2.5和3呢?5,2?
2.5和3之间的整数是2?我滴个乖乖颠覆价值观呀。小学白上了。
也就是说我们需要分开讨论
- 首先判断两个数字是否存在(也就是是否输入了两个值)
- 判断max和min的关系?①max==min考虑2.2和2.2 ②max>min,考虑2.2,2.1情况,2.2,1的情况 ③min>max
- 不同条件下分开考虑写不同的算法
function getNum(num1, num2) {
if (num1 === null || num2 === null) {
return "请输入两个值";
}
let min = Math.min(num1, num2)
let max = Math.max(num1, num2)
if (max == min) {
if (max == Math.ceil(max)) {
//情形一:相同的整数例如:2和2
return max
}
else if (Math.floor(max) < max) {
//情形二:小数情形:2.2和2.2
return null
}
}
else if (max > min) {
// 情形一:在两个相邻整数区间且都是小数2.2,2.5
if(Math.ceil(max)===Math.ceil(min)){
return null
}
else if(Math.floor(max)===Math.ceil(min)){
// 情形二:在两个相邻整数区间,且有一个为整数2.3, 3
return Math.floor(max)
}
else{
// 情形三:存在小数,但不在两个相邻整数的区间
return Math.floor(Math.random()*(max-Math.ceil(min))+Math.ceil(min))
}
}
else{
// min>min的情况
return "请输入正确的区间,不存在此区间";
}
}
console.log(getNum(2,2));
console.log(getNum(2.2,2.2));
console.log(getNum(2.2,2.5));
console.log(getNum(2.3,3));
console.log(getNum(2.2,4));
console.log(getNum(2.2,2));
确实心累,不过考虑问题要全面
记住即可,给我背,往死里背哈哈哈,当然多写几个算法才是记忆深刻,要记在思想里,不要记在嘴里,学会运用