-
-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[js] 第1天 用递归算法实现,数组长度为5且元素的随机数在2-32间不重复的值 #3
Comments
|
var arr=new Array(5); |
点评: |
var arr = []; //数组 |
|
|
var arr = new Array(5); |
考虑一下扩展性 function insertArr(arr, i = 0, min = 2, max = 32) {
const num = Math.max(min, Math.ceil(Math.random() * max))
if (!arr[arr.length - 1]) {
if (!arr.includes(num)) {
arr[i++] = num
}
return insertArr(arr, i)
}
return arr
}
const arr = new Array(5);
const result = insertArr(arr) 这里的随机数算法是有问题的,具体参见下面 @likeke1997 的答案。另外用四舍五入也是不对的,因为最小值和最大值只有其它值概率的一半。 仔细一看,虽然自定义了最大最小参数,但是递归的时候没有传入,所以并没有卵用。i 参数的初衷是自定义从哪里开始插入,实用性也没有 @likeke1997 的 length 参数来的好。 |
function getUNumber(arr, min, max) {
|
var arr = new Array(5);
function insertRandom(n) {
if (n < 0) return
let tmp = Math.floor(Math.random() * 31 + 2)
if (arr.indexOf(tmp) !== -1) return insertRandom(n)
arr[n] = tmp
return insertRandom(n - 1)
}
insertRandom(arr.length - 1) |
|
function createArr(arr) { |
function foo(arr) {
arr = arr || []
if (arr.length >= 5) {
return arr
}
var n = 2 + Math.floor(Math.random() * 31)
if (arr.indexOf(n) == -1) {
arr.push(n)
}
return foo(arr)
} |
|
|
function buildArray(arr, length, min, max) {
if (!Array.isArray(arr)) arr = []
if (length < 1) return []
if (arr.length === length) return arr
const random = Math.random() * (+max - +min) + +min
if (!arr.includes(random)) arr.push(random)
return buildArray(arr, length, min, max)
}
buildArray([], 5, 2, 32) |
|
|
function returnRandomArr(max, min, length, arr = []) {
arr.push(Math.floor(Math.random() * (max - min)) + min);
arr = Array.from(new Set(arr))
return arr.length < length ? returnRandomArr(max, min, length, arr) : arr
}
let arr = returnRandomArr(32, 2, 5)
console.log(arr) |
|
|
// 尾递归
function randomArr(count, arr = []) {
if(count === 0) return arr;
let num = Math.floor(Math.random() * 31) + 2;
if(!arr.includes(num)) {
arr.push(num);
count--;
}
return randomArr(count, arr);
}
console.log(randomArr(5)) |
补充: // 在 2 - 5 区间内生成随机数
var min = 2, max = 5;
var result = Math.max(min, Math.ceil(Math.random() * max));
// 参数一 param1 恒等于 2
// 参数二 param2 在 [0, 5] 之间等概取值
// 可能性见下
// param1 2 2 2 2 2 2
// param2 0 1 2 3 4 5
// result 2 2 2 3 4 5 可见 result 取到 2 的概率大于 3/4/5。 @linghucq1 |
为啥要 |
这是我的答案,大家可以参考下 |
|
function gen(arr, n) { |
`
} |
|
您的来信已收到!谢谢 ——李方正
|
|
您好,邮件已收到,我会尽快回复。
|
您的来信已收到!谢谢 ——李方正
|
|
您的来信已收到!谢谢 ——李方正
|
你好 邮件已收到 |
您的来信已收到!谢谢 ——李方正
|
|
function genArr(res=[]) {
const value = Math.floor(Math.random()*31 + 2)
if(res.indexOf(value)<0) return (res.push(value)<5 && genArr(res),res)
return genArr(res)
} |
您好,邮件已收到,我会尽快回复。
|
你的邮件我已收到,我会尽快处理
|
您的来信已收到!谢谢 ——李方正
|
function getUniqueRandomNumbers(arr, n) { const result = getUniqueRandomNumbers([],5); |
您的来信已收到!谢谢 ——李方正
|
|
|
let arr = [];
function pushArr() {
if (arr.length == 5) return console.log(arr);
let num = Math.floor(Math.random() * (31 - 2) + 2);
if (arr.indexOf(num) == -1) arr.push(num);
pushArr();
}
pushArr(); |
您好,邮件已收到,我会尽快回复。
|
您的来信已收到!谢谢 ——李方正
|
function foo(length, min, max) {
|
您好,邮件已收到,我会尽快回复。
|
您的来信已收到!谢谢 ——李方正
|
function fn(set = new Set()) { |
您好,邮件已收到,我会尽快回复。
|
您的来信已收到!谢谢 ——李方正
|
const radomNum = () => {
return Math.floor(Math.random() * 31 + 2)
}
const createArr = (arr) => {
if (arr.length >= 5) {
return arr;
}
const num = radomNum();
if (arr.includes(num)){
createArr(arr);
} else {
arr.push(num);
createArr(arr)
}
}
const res = createArr([])
console.log(res) |
这一题是起源题
描述:
a) 生成一个长度为5的空数组arr。
b) 生成一个(2-32)之间的随机整数rand。
c) 把随机数rand插入到数组arr内,如果数组arr内已存在与rand相同的数字,则重新生成随机数rand并插入到arr内[需要使用递归实现,不能使用for/while等循环]
d) 最终输出一个长度为5,且内容不重复的数组arr。
The text was updated successfully, but these errors were encountered: