蓝桥杯Web:【算法实现】随机数生成器
【算法实现】随机数生成器背景介绍实际工作中随机数的使用特别多,比如随机抽奖、随机翻牌。通过随机数还能实现很多有趣的效果,比如随机改变元素的位置或颜色。
本题需要在已提供的基础项目中使用JS知识封装一个函数,该函数可以根据需要,生成指定范围和个数的不重复的随机数数组。
步骤准备在开始答题前,你需要在线上环境终端中键入以下命令,下载并解压所提供的文件。
wgethttps://labfile.oss.aliyuncs.com/courses/7835/exam12-imi.zip&&unzipexam12-imi.zip&&rmexam12-imi.zipcopy下载完成之后的目录结构如下:
├──index.html#页面布局└──js├──index.js#页面功能实现的逻辑代码copy源码下载后,选中index.html右键启动WebServer服务(OpenwithLiveServer),让项目运行起来。
接着,打开环境右侧的【Web服务】,就可以在浏览器中看到如下效果:
图片描述
当前并未生成并显示指定条件的随机数。
考试要求请在index.js文件中补全函数getRandomNum中的代码,最终将根据指定条件生成的随机数显示在页面中。
具体需求如下:
封装函数getRandomNum(min,max,countNum)。生成min~max范围的countNum个不重复的随机数,最终这些随机数以一个数组的形式返回。最终实现效果如下:
图片描述
要求规定请严格按照考试步骤操作,切勿修改考试默认提供项目中的文件名称、文件夹路径等。满足题目需求后,保持Web服务处于可以正常访问状态,点击「提交检测」系统会自动判分。总通过次数:193|总提交次数:200|通过率:96.5%
题解考点:Math.random()生成一个0.0-1.0之间的随机数
constgetRandomNum=function(min,max,countNum){vararr=[];//在此处补全代码while(arr.lengtharr.push(num);}}returnarr;};module.exports=getRandomNum;//请勿删除我真菜啊,解题过程中写了几次死循环,把浏览器都卡死了。。。。
伪随机数生成器介绍
伪随机数生成器介绍¶概述¶伪随机数生成器(pseudorandomnumbergenerator,PRNG),又称为确定性随机位生成器(deterministicrandombitgenerator,DRBG),是用来生成接近于绝对随机数序列的数字序列的算法。一般来说,PRNG会依赖于一个初始值,也称为种子,来生成对应的伪随机数序列。只要种子确定了,PRNG所生成的随机数就是完全确定的,因此其生成的随机数序列并不是真正随机的。
就目前而言,PRNG在众多应用都发挥着重要的作用,比如模拟(蒙特卡洛方法),电子竞技,密码应用。
随机性的严格性¶随机性:随机数应该不存在统计学偏差,是完全杂乱的数列。不可预测性:不能从过去的序列推测出下一个出现的数。不可重现性:除非数列保存下来,否则不能重现相同的数列。这三个性质的严格性依次递增。
一般来说,随机数可以分为三类
类别随机性不可预测性不可重现性弱伪随机数✅❌❌强伪随机数✅✅❌真随机数✅✅✅一般来说,密码学中使用的随机数是第二种。
周期¶正如我们之前所说,一旦PRNG所依赖的种子确定了,那么PRNG生成的随机数序列基本也就确定了。这里定义PRNG的周期如下:对于一个PRNG的所有可能起始状态,不重复序列的最长长度。显然,对于一个PRNG来说,其周期不会大于其所有可能的状态。但是,需要注意的是,并不是当我们遇到重复的输出时,就可以认为是PRNG的周期,因为PRNG的状态一般都是大于输出的位数的。
评价标准¶参见维基百科,https://en.wikipedia.org/wiki/Pseudorandom_number_generator。
分类¶目前通用的伪随机数生成器主要有
线性同余生成器,LCG线性回归发生器MersenneTwisterxorshiftgeneratorsWELLfamilyofgeneratorsLinearfeedbackshiftregister,LFSR,线性反馈移位寄存器问题¶通常来说,伪随机数生成器可能会有以下问题
在某些种子的情况下,其生成的随机数序列的周期会比较小。生成大数时,分配的不均匀。连续值之间关联密切,知道后续值,可以知道之前的值。输出序列的值的大小很不均匀。参考¶https://en.wikipedia.org/wiki/Pseudorandom_number_generator