请补全JavaScript代码,实现一个函数,要求如下:
1. 根据输入的数字范围[start,end]和随机数个数"n"生成随机数
2. 生成的随机数存储到数组中,返回该数组
3. 返回的数组不能有相同元素
注意:
1. 不需要考虑"n"大于数字范围的情况
输入:
getUniqueNums(2,10,4) //在2~10内生成四个随机数
输出:
[4,6,2,8]
Math.random() 取[num1,num2)之间int类型随机数的格式为 :
int random= (int)(Math.random()*(num2-num1)+num1)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<script>
const _getUniqueNums = (start,end,n) => {
// 补全代码
var arr = new Set()
for(var i = 0; i<n;i++){
let random = Math.floor(Math.random()*(end-start)+start)
arr.add(random)
}
return[...arr.values()]
}
</script>
</body>
</html>
这段代码的作用是生成指定范围内的指定数量的不重复随机数数组。下面我逐步解析这段代码:
-
const _getUniqueNums = (start, end, n) => { }
这是一个箭头函数的定义,接受三个参数start
、end
和n
,分别表示随机数的范围起始值、结束值,以及要生成的随机数的数量。 -
var arr = new Set()
: 这一行创建了一个空的 Set 对象arr
,Set 对象是一种特殊的数据结构,其中的元素是唯一的,不会重复。 -
for(var i=0;i<n;i++){}
这是一个 for 循环,用于生成指定数量的随机数。循环从 0 开始,直到n
,每次增加 1。 -
let random = Math.floor(Math.random() * (end - start) + start)
: 这一行生成一个随机数random
,使用Math.random()
生成一个 0 到 1 之间的随机小数,然后将其乘以(end - start)
,这样可以得到一个在指定范围内的随机小数。然后使用Math.floor()
向下取整,得到一个整数值,并加上start
,以确保随机数在指定范围内。 -
arr.add(random)
: 这一行将生成的随机数random
添加到 Set 对象arr
中。由于 Set 对象的特性,如果添加的元素已经存在,则不会重复添加,保证了数组中的元素唯一性。 -
return [...arr.values()]
: 这一行将 Set 对象arr
转换为数组,并返回该数组。arr.values()
返回一个迭代器对象,其中包含 Set 对象中的所有值,使用扩展运算符[...arr.values()]
将迭代器对象转换为数组。
至于为什么使用 var
和 let
:
var
是 JavaScript 中的旧的变量声明关键字,在函数作用域内声明的变量具有函数级作用域。let
是 ES6 新引入的变量声明关键字,具有块级作用域,只在包含它们的代码块内有效。 在这段代码中,使用let
来声明循环中的random
变量是因为let
具有块级作用域,每次循环迭代都会创建一个新的random
变量,避免了在循环中出现变量提升等问题。