是这样,算法要求,每秒生成一个随机数,这个随机数必须是符合一定要求的。有什么比较高效的算法。
譬如
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0]
20个数组元素,采用 Math.floor(20*Math.random()),生成随机数后,需要验证,如果对应的数组元素为1,则重新生成。
一般来说,有两种算法,第一种就像我上面说的,每次生成后去验证,对应元素是否为1,这样做的弊端就是当整个数组大部分都是1的时候,生成随机数的效率很低。
还有一种算法,就是在生成之前,统计数组中数组元素不是1的个数(此处是17),然后在这17个元素里面生成一个随机数,这样的弊端就是每次生成之前都要消耗大量资源。
除了以上两种算法,还有没有更好一点的算法,能高效的生成符合要求的随机数?
这个问题被你描述复杂了,算法如何变得简单?思路非常重要。其实你就是想要生成20个数,同时这个20个数是从0~20之中随机生成,对不对?另外,我注意到
Math.floor
即取整,类似于~~
双重按位非,也就是说,生成的数是整数。基于此,可简化如下为:『获取一定范围内的有限个随机整数』,生活对应的例子就是抓阄(20个人依次排队抓到自己的名字,就是20个数的一种随机顺序)。算法如下(比今年早些时候某前端架构师的代码更加高效):以上,各参数分别代表:最小值,最大值,范围之内生成的随机数个数。
这个算法,本地循环1w遍也不会有压力。