涉及数学原理模型为初中不等式基础知识。
对于任意整数m、n,m<n,用JS获取m、n之间的随机整数。
区间内随机整数生成公式
一、floor()方法实现公式如下:
[m,n)区间内的随机整数:
//[m,n)范围内的随机整数
var a = Math.random(); //[0,1)范围内的随机数
var num = Math.floor((n - m) * a + m);
(m,n)区间内的随机整数:
var a = Math.random(); //[0,1)范围内的随机
var num = Math.floor((n - m-1) * a + m+1);
[m,n]区间内的随机整数(等价于[m,n+1)区间内的随机整数:
var a = Math.random(); //[0,1)范围内的随机数
var num = Math.floor((n+1 - m) * a + m);
(m,n]区间内的随机整数(等价于[m+1,n+1)区间内的随机整数):
var a = Math.random(); //[0,1)范围内的随机数
var num = Math.floor((n-m) * a + m+1);
二、ceil()方法实现公式如下:
1、(m,n]范围内的随机整数(m、n均为整数,m<n):
var a = Math.random(); //[0,1)范围内的随机数
var b = -a + 1;//(0,1]范围内的随机数
var num = Math.ceil((n - m) * b + m);
2、(m,n)范围内的随机整数(m、n均为整数,m<n):
var a = Math.random(); //[0,1)范围内的随机数
var b = -a + 1;//(0,1]范围内的随机数
var num = Math.ceil((n - 1 - m) * b + m);
3、[m,n)范围内的随机整数(m、n均为整数,m<n):
var a = Math.random(); //[0,1)范围内的随机数
var b = -a + 1;//(0,1]范围内的随机数
var num = Math.ceil((n - m) * b + m-1);
4、[m,n]范围内的随机整数(m、n均为整数,m<n):
var a = Math.random(); //[0,1)范围内的随机数
var b = -a + 1;//(0,1]范围内的随机数
var num = Math.ceil((n - m+1) * b + m-1);
数学推导过程:
floor()方法
对于任意整数m、n,m<n,用JS表示获取m、n之间的随机整数。
公式如下:
数学推导过程:
a=Math.random() ,它的值为0≤ Math.random()<1。真实情况下,由于JavaScript设计存储为十六为小数,实际代表数值所能代表的极限为0≤ Math.random()≤0.
一、区间随机整数推导
1、若a为区间为[0,1)的随机数,用a表示区间[0,10)的随机数b,写出a、b关系的数学表达式。
b=10a
2、若a为区间为[0,1)的随机数,用a表示区间[2,12)的随机数b,写出a、b关系的数学表达式。
b=10a+2
3、若a为区间为[0,1)的随机数,用a表示区间[2,10)的随机数b,写出a、b关系的数学表达式。
随机数a、b满足0≤a<1,2≤b<10,需要写出a、b的数学关系式。只需要将两个不等式转化为前后系数相同即可。
0≤a<1 转化为 2≤?<10的形式
0≤a<1
左右各式乘以正数k:
0≤ak<k
左右各式加2可得:
2≤ak+2<k+2
与2≤b<10不等式前后项对比可得:
ak+2=b
k+2=10
可以得知:
k=10-2
b=(10-2)a+2
由特殊到一般,可以推导得知:
若a为区间为[0,1)的随机数,用a表示区间[m,n)的随机数b,写出a、b关系的数学表达式。(m<n)
b=(n-m)a+m
那么对b向下取整即[m,n)范围内的随机整数。
JS代码如下:
//[m,n)范围内的随机整数
function f(m, n) {
var a = Math.random(); //[0,1)范围内的随机数
var num = Math.floor((n - m) * a + m);
return num;
}
上面代码等价于求[m,n-1]区间内的随机整数。m、n为正整数,n>m。
那么对于[m,n]区间内的随机整数JS代码如下:
//[m,n]范围内的随机整数(n>m)
function f(m, n) {
var a = Math.random(); //[0,1)范围内的随机数
var num = Math.floor((n+1 - m) * a + m);
return num;
}
那么对于(m,n]和(m,n)区间的随机整数情况呢?
(m,n)区间的随机整数,等价于[m+1,n)区间内的随机整数,可以获取JS代码:
//(m,n)范围内的随机整数
function f(m, n) {
var a = Math.random(); //[0,1)范围内的随机数
var num = Math.floor((n - m-1) * a + m+1);
return num;
}
(m,n]区间的随机整数,等价于[m+1,n-1)区间内的随机整数,可以获取JS代码:
// (m,n]区间的随机整数,等价于[m+1,n+1)区间内的随机整数
function f(m, n) {
var a = Math.random(); //[0,1)范围内的随机数
var num = Math.floor((n-m) * a + m+1);
return num;
}
ceil()方法
对于任意整数m、n,m<n,用JS表示获取m、n之间的随机整数。
a=Math.random() ,它的值为0≤ Math.random()<1
0≤a<1
由于ceil()方法是向上取整,需要基础随机数进行调整才能满足JS取整数区间内随机整数的条件。
如图所示,ceil()方法若想实现类似floor()方法的相同的效果,需要有一个基础随机变量在(0,1]范围内,才能满足条件。
0≤a<1……①
那么①x(-1)有
-1<-a≤0……②
①+1得:
0<-a+1≤1……③
令β=-a+1,则0<β≤1。
1、若β为(0,1]的随机数,用β表示区间(0,10]的随机数b,写出β、b关系的数学表达式。
b=10β
2、若β为(0,1]的随机数,用β表示区间(2,12]的随机数b,写出β、b关系的数学表达式。
b=10β+2
3、若β为(0,1]的随机数,用β表示区间(2,10]的随机数b,写出β、b关系的数学表达式。
0<β≤1,2<x≤10;
2<x≤10
不等式各项同时减去2
0<x-2≤8
不等式各项除以8
0<(x-2)/8 ≤1
即
(x-2)/8=β
变形有:
x=8β+2
β、b关系的数学表达式:
b=8β+2
由特殊到一般,可以推导得知:
若β为区间为(0,1]随机数,用β表示区间(m,n]的随机数b,写出β、b关系的数学表达式。(m<n)
b=(n-m)β+m
那么对b向上取整即(m,n]范围内的随机整数。
JS代码:
1、(m,n]范围内的随机整数(m、n均为整数,m<n):
// (m,n] m n均为整数 ,m<n
function f(m, n) {
var a = Math.random(); //[0,1)范围内的随机数
var b = -a + 1;//(0,1]范围内的随机数
var num = Math.ceil((n - m) * b + m);
return num;
}
2、(m,n)范围内的随机整数(m、n均为整数,m<n):
// (m,n) m n均为整数 ,m<n
//(m,n)范围内随机整数,等价于(m,n-1]范围内随机整数
function f(m, n) {
var a = Math.random(); //[0,1)范围内的随机数
var b = -a + 1;//(0,1]范围内的随机数
var num = Math.ceil((n - 1 - m) * b + m);
return num;
}
3、[m,n)范围内的随机整数(m、n均为整数,m<n):
// [m,n)范围内的随机整数(m、n均为整数,m<n)
//[m,n)范围内随机整数,等价于(m-1,n-1]范围内随机整数
function f(m, n) {
var a = Math.random(); //[0,1)范围内的随机数
var b = -a + 1;//(0,1]范围内的随机数
var num = Math.ceil((n - m) * b + m-1);
return num;
}
4、[m,n]范围内的随机整数(m、n均为整数,m<n):
// [m,n]范围内的随机整数(m、n均为整数,m<n):
//[m,n]范围内随机整数,等价于(m-1,n]范围内随机整数
function f(m, n) {
var a = Math.random(); //[0,1)范围内的随机数
var b = -a + 1;//(0,1]范围内的随机数
var num = Math.ceil((n - m+1) * b + m-1);
return num;
}
思考:为什么JS主流的随机非负区间范围内的整数都是用Math.floor()方法来实现,而不采用Math.ceil()、parseInt()等方法来实现,与之对比有什么优势?感兴趣的同学试试用JS采用parseInt()等方法方法实现,思考其与floor()方法实现的区别。