clearwater 发表于 2020-2-19 17:10

JS基础:求任意两个值之间的整数公式只能死记硬背吗?(请水神不要回帖)

本帖最后由 clearwater 于 2020-2-19 19:06 编辑

请不要来回复一些对楼主没有帮助的水帖。--例:路过,感谢分享,帮顶等之类。

我在跟某前端教程视频学习。学到Math.random 求整数时,视频老师说,只要把下面这个红色的公式背上或到时自己复制上就行了。他没讲这个公式是咋推出来的。
Math.floor(Math.random() * (max - min + 1)) + min;

什么是Math.floor, Math.random, 这些用法我都懂了。
请问大神,真的要死记硬背吗?

能不能讲讲这个公式到底是怎么把{:1_904:}

function getRandom(min, max) {

            return Math.floor(Math.random() * (max - min + 1)) + min;

      }
      console.log(getRandom(1, 10));

niexin 发表于 2020-2-19 17:13

是的,有必要记住,会简单些

518 发表于 2020-2-19 17:23

math.floor 向下取整random为[0,1)小数
将random理解为百分比
整数上下限为max,min 长度为max-min+1
所以取随机的长度即为用随机的百分比*总长度
再将结果向下取整最后加上min(最小值)

BerTom 发表于 2020-2-19 17:23

max - min + 1是区间长度,在这个长度内随机,然后再加上一个最小值min
我认为不应该死记,应该要理解性的记忆

quandu 发表于 2020-2-19 17:24

random方法返回[0,1)---
你想要的区间----可以看出随机一个数再加上min
0到1变成了0到max-min 扩大了 (max-min)倍
所以 rand * (max - min) + min
但是上面的式子最多取到 max-1, 需要(max-min+1)
所以最后 rand * (max - min+1) + min

少年A 发表于 2020-2-19 18:07

你就想象有个随机0-1的数,怎么表达0-X,那就是1要对应X,扩大X倍就行。
如果不是0-X怎么办呢?例如1-X,那我就先扩大X-1倍,就变成0到X-1,这时候再+1就行了。
其他同理。

可爱的男孩子 发表于 2020-2-19 18:17

本帖最后由 可爱的男孩子 于 2020-2-19 18:33 编辑

Math.floor(Math.random() * (max - min + 1)) + min;

random方法返回的是个整数
假设取0-100
Math.random() * 100
结果显然只会是0-99
为什么?
你0.9999不管乘几个0都不可能超过1
这个多余的1就是为了满足这个要求让你有进入100的可能性


那么就剩下最后的min了
因为你要考虑你需要的最小值问题



你是觉得max - min难懂?
你多拿几个值来换进去
100 0 -> 100*0.99999
100 1 ->99*0.999999
50 40->10*0.99999
发现问题了没
它的最大值永远都比两个值的区间少1,最终当然要多来一个1也就是多一个0.999凑整
最后的最小值就是维护最小值了没啥好说的

前者理解为维护一个整数区间
后者理解为保证一个最小值
浮动区间 + 最小值 <= 最大值

zoushanpingw 发表于 2020-2-19 18:22

本帖最后由 zoushanpingw 于 2020-2-19 20:33 编辑

看来我的回答是当成水了{:1_909:}

女萝岩 发表于 2020-2-19 18:39

设0<=x<1,其实x就是math.random
设min<=ax+b<max
由0<=x<1得
0<=ax<a
b<=ax+b<a+b
两边对比一下可得
b=min且a+b=max
所以b=min,a=max-min

所以min<=(max-min)*x+min<max,这个很常用的。

如果直接给不等式取floor的话那么就是:
min<=floor[(max-min)*x+min]<=max-1,//注意右边是有等号的
问题是你要的是min到max之间的数啊,而我们产生的确实min到max-1之间的那怎么办呢? 给(max-min)*x+min加上一个0到1之间的数就可以了,什么东西能产生0到1之间的数呢?就是math.random,我们用x代替
min+x<=(max-min)*x+min+x<max+x
给不等式取floor运算得,而x其实就是math.random
min<=floor<=max//注意是有等号的
而floor
=floor[math.random(max-min+1)+floor(min)
=floor[math.random(max-min+1)+min




clearwater 发表于 2020-2-19 19:06

本帖最后由 clearwater 于 2020-2-19 23:23 编辑

@quandu
@ 518
@少年A
@可爱的男孩子
@BerTom
@女萝岩

谢谢各位大神热心帮助。我比较愚笨,不太明白你们讲的。不过这个问题我已搞明白了。(看完视频,再看你们的回帖,好懂多了)

我正在学的某马教程,老师让死记硬背。后来我去找另一个课程的前端来看,这个课程有讲解到这个知识点。我已明白了这个算法了。

你们的热情让我感动。在3天内,我给每个人各一个热心,按前后回答顺序给。(后面回答的大神就没有辣。)

另外我看到有三个人收藏了我的帖子,不知是不是也在默默一起学习呢?如果你们没有明白,可以去看看下面这个视频。
视频中有广告。担心违规,所以取消了。我也没办法把视频中的广告去掉。

最后感谢,楼中所有回复的大神们,个别没有评分,实在不好意思
页: [1] 2
查看完整版本: JS基础:求任意两个值之间的整数公式只能死记硬背吗?(请水神不要回帖)