前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >震惊!JS随机数历险重大发现

震惊!JS随机数历险重大发现

作者头像
江涛学编程
发布2020-06-19 16:24:05
2.9K0
发布2020-06-19 16:24:05
举报
文章被收录于专栏:江涛的博客江涛的博客

今天,我本来是想写关于福利彩票的随机数相关内容的,素材数据我都备好了,有福彩“15选5”、福利“6+1”、“七乐彩”、“3D”、“福利双色球”等等,但是考虑到放进来就太长了文章,所以先阉割一部分,等后面深入研究好以后再写结论吧。

先说下随机数,随机数这个真的很有用,哪怕有一天你离开学校,数学知识也还给了老师,它还是会潜移默化地深入你的生活。例如玩小游戏抛硬币啊、买彩票,活动抽奖等,下面就让我们跟随作者的脚步一起复习下在Javascript中关于随机数的知识吧。

我个人认为,随机数拿来面试初试刷人是蛮好的。

下面我分别从“随机数”、“随机整数”、“随机字符串”以及如何实现一个随机数去带领大家了解随机数,也让大伙感受下我的脑洞,最后的话,我会分享一题大厂相关的面试题。

首先,随机数,在JavaScript是有专门的函数的,那就是Math.random()。它产生的是一个0-1的随机数,这里我个人认为你脑子里把它影射成百分比是极好的。码农的直觉,我也不知道为啥。

如果说让你直接写Math.random,你觉得这样合适吗?很显然,它不合适,所以我们这边给它封装一个函数,定义一个区间形如[start,end),输出一个介于区间的数。“数”这里圈一下,要考,这里没有明确是个啥数希望你知道。

先说下思路吧,做事情没有思路再怎么努力就如同船在大海中迷失了方向。这里意思下,楼上的那位就用[a,b)区间替代了,要产生a和b之间的数,那么肯定是a加上ab之间距离的某个随机百分比,那么代码就出来了咯。

代码语言:javascript
复制
/**
 * @Author      Jiangtao   Zheng
 * @DateTime    2019-07-12
 * @Description  这个是产生了一个随机数再[start, end)
 * @param    {number} start 开始范围
 * @param    {[number]} end 结束范围
 * @return   {[number]} 返回结果
 */
function randomInteger(start, end) {
    return start + (end - start) * Math.random()
}

console.log("the random number in function randomInterger is ", randomInteger(5, 10))

边锋的某位游戏负责人曾经告诉我,不管你用什么牛逼的技术框架,还是要多思考业务,根据业务来,实践出真知。这里出来是出来了,有个锤子用啊!能应用到生活实际场景吗?比如说抽奖选取幸运观众,或者说是随机点名啊,你见过人被劈一半的吗?所以既然发现这个问题,那么我们势必要进行优化,很简单的,Math.floor一把梭,完美!

代码语言:javascript
复制
function randomInteger_2(start, end) {
    return Math.floor(start + (end - start) * Math.random())
}

console.log("the random number in function randomInterger_2 is ", randomInteger_2(5, 10))

想一想,能不能再优化一下,飘一点的写法,最好就你自己看得懂,铁饭碗就来了,这里上ES6吧,简单点,代码能阉割就阉割一点,废话的行数请省略。。。。。。

代码语言:javascript
复制
let randomInteger_2_es6 = (start, end) => Math.floor(start + (end - start) * Math.random())
console.log("the random number in function randomInterger_3 is ", randomInteger_2_es6(500, 1000))

这样子看起来,好像是可以为所欲为地实现一个任意[a,b)区间的这样一个点名或者是抽奖这样一个例子,这个就是随机整数。

随机字符串怎么搞?有一次,我去访问某些个人站长他们做的网站的时候,你鼠标在网站上,随意点一下,会弹出“富强、文明、和谐、民主”。这个我们暂且把它理解位随机字符串吧,好不好。

那么我们接下来来实现一下,我们需要明确一点,在楼上的基础上,我们已经有创建一个随机整数的生产力了。那么很容易联想到数组的下标对吧,而且我们JS贼牛逼,不仅可以数字,字符也可以啊对吧。低调一点,这边就数字吧,先创建一个数组,把楼上那句话拆好塞进去,随机数函数带进去就解决了嘛。

这里还更简单,因为数组长度是确定的,一个参数就OK了。具体的实现如下:

代码语言:javascript
复制
let RandomArr = ['富强', '民主', '文明', '和谐'];

function RandomStr(length) {
  return Math.floor(length*Math.random());
}

let res = RandomStr(RandomArr.length);
console.log(RandomArr[res]);

然后的话,再看看,这次不是码农的直觉,是男人的直觉。我就想这个边界值它会不会取到的概率会低一点,因为既然是字符串,就要考虑一个概率问题和对社会的影响,例如很多次都是“民主”,你不“富强”啦。所以的话,猥琐点,你给它中间补一刀“富强”,“和谐”也是一样的啦。边界值是重点。

最后的话,我们思考下它实现的原理,为啥会有这样的想法呢?我老实说吧,是我去面试被虐的,就是面试官他很喜欢问你某个啥啥啥的原理是什么?他为什么会有这个想法呢?大学就那样吧,都是过来人都知道的,也别指望太好,但是总是要刷人的啊,一方面学历是硬伤,另一方面就是你所储备的知识是否能够与面试官原理之问抗衡,达到双赢的这样一个状态。

这次是理科生的直觉,但凡复杂的各种问题都应该归纳到数学建模的范畴去解决。脚后跟想想就知道,肯定有相应的数学公式的啊。你再去研究个公式,没这个必要啊,人家坟头草都三丈了,兄弟!你直接拿来用吧,转换成计算机语言。有些公式相当复杂的,我高等数学已经还给我老师了,恕我这里就不伤害我的大脑了,有兴趣的请自行研究。

但是我基本的数学,理科生素养是有的啊,浙江考生是不会这么轻易屈服的。我就开始琢磨着有理数,无理数,我截取一段行不行,还有Π啊和log E啊之类的,能不能他们组合一下,经过一些算数可以,后来我思考了下,以我仅剩下玩俄罗斯方块的数学实力不足以面对它。

那再换一条路子吧,浙江的男人绝不服输。在处理一些时间问题上,我注意到了时间函数它的时间戳是不一样的,可以作为一个凭证区分。知道这一点,我阴也把它阴出一个随机生成数出来。这里我们定义生成一个0-9的随机数,当然这个其实你可以灵活设置,我这边就意思下。

代码语言:javascript
复制
function randomNow() {
  let rStr = new Date().getTime().toString();
  return rStr[rStr.length -1];
}


let res = randomNow();
console.log("result:", res);
console.log(typeof res);

最后我们分享一题大厂的面试真题。它的原题来自大搜车,大搜车是一家独角兽公司,其Node.js的氛围是极好的,毫不夸张地说,在杭州Node生态圈可以说是第二梯队的,他们厂在杭州无常,不过开发的话不在那个大厂房那里,在天蝎座啥楼那里,现在通地铁了,那里出现也蛮方便的,有兴趣的同学可以去试一试,氛围挺好的。

题目是一个填空题,一行打乱一个数组。

这个“打乱”要圈一下,考试要考。

正规的做法,一句话,如果涉及到函数,很容易想到ES6的箭头函数,然后就是让它尽可以多的选择,三元运算符也是很容易想到的,那么答案就基本上出来了。

代码语言:javascript
复制
let Arr = [2,0,1,9,0,6,1,3];
console.log(Arr.reverse());
console.log(Arr.sort((a,b) => Math.random > 0.5 ? -1 :1))

猥琐一点,我觉得既然是打乱,你又没说怎么打乱,reverse()函数不行吗?这个是实在没办法你这样写,第一个看起来low,第二个有阅历点的面试官一看就知道你幼儿园水平的,反而起到了一个不太好的印象,这个人怎么这么喜欢钻空子哦。

但是这个结果却很令人意外,我是比较懒的,能用Node就坚决不用浏览器那边写,但是发现Node打出来的结果不符合预期以后,我就开始怀疑人生,什么鬼???想了下会不会浏览器能给我一个符合预期的答案,结果是真的哎,wtf???发生了什么,打了同一段代码,浏览器和Node的运行结果居然不一样!Oh,amazing. I just discovered the New World. 具体的我也不知道发生了啥,如果有大佬知道,望指导小弟,小弟在此谢过了!这里我们文后讨论吧,或者在下方留言!

故事就讲到这里,最后的话。还是想多说些题外话,面试这东西,如果你还对这个现世抱有不满,想改变这个格局,那你就要时刻准备着接受组织检验!绝大部分题目我们努力咬咬牙都是可以的,及个别智商题,那是用来刷人区分人的,尽人事知天命吧!实在不会,甩头就走,不要回头!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 江涛学编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档