吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1462|回复: 11
收起左侧

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

[复制链接]
clearwater 发表于 2020-2-19 17:10
本帖最后由 clearwater 于 2020-2-19 19:06 编辑

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

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

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

能不能讲讲这个公式到底是怎么把[0,1)的任意小数变任意整数, 或者这个公式是咋推导出来的?

[JavaScript] 纯文本查看 复制代码
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(最小值)

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
clearwater + 1 + 1 谢谢@Thanks!

查看全部评分

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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
clearwater + 1 + 1 谢谢@Thanks!

查看全部评分

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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
clearwater + 1 + 1 谢谢@Thanks!

查看全部评分

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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
clearwater + 1 + 1 谢谢@Thanks!

查看全部评分

可爱的男孩子 发表于 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凑整
最后的最小值就是维护最小值了没啥好说的

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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
clearwater + 1 + 1 我很赞同!

查看全部评分

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

看来我的回答是当成水了
女萝岩 发表于 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[math.random(max-min+1)+min]<=max  //注意是有等号的
而floor[math.random(max-min+1)+min]
=floor[math.random(max-min+1)+floor(min)
=floor[math.random(max-min+1)+min




免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
clearwater + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| clearwater 发表于 2020-2-19 19:06
本帖最后由 clearwater 于 2020-2-19 23:23 编辑

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

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

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

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

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

最后感谢,楼中所有回复的大神们,个别没有评分,实在不好意思

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
BerTom + 1 + 1 加油!
少年A + 1 + 1 用心讨论,共获提升!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-30 07:13

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表