首先,不能使用任何内置方法。例如sort
,pop()
。我可以使用的仅仅是循环,数组等。
我想创建一个函数,该函数将数组作为参数并生成随机的数字字符串,其中不包含数组中给出的这些数字。
例如,shift()
(2和6将不存在)。
数组长度可能会更改(func([6, 2]) //=> "20353"
,[6, 2, 9]
)。因此,该函数必须能够容纳任意长度的数组。
为了解决这个实践问题,我使用了[7, 2, 1, 9]
和for
循环。但是,我遇到一个问题,当检查第二个索引(在示例中,是否随机生成的数字是否包含2),如果包含第二个索引,我将重新生成随机数,并可能生成第一个索引号(在此示例中)情况下,6)我不想要的。
请参阅我在下面发布的代码,并帮助我解决该问题。最重要的是,如果还有另一种获得相同结果的方法是更好的方法,请也告诉我。
while
预期输出:
let str = "";
let arr = [];
let tem
const func = arg2 => {
for (let i = 0; i < 5; i++) {
arr[i] = Math.floor(Math.random() * 10);
}
for (let i = 0; i < arr.length; i++) {
for (let v = 0; v < arg2.length; v++) {
if (arg2[v] == arr[i]) {
do {
tem = Math.floor(Math.random() * 10);
} while (tem == arr[i])
arr[i] = tem;
}
}
}
for (let i = 0; i < arr.length; i++) str += arr[i]
return str
}
console.log(func([6, 2]))
// the output will not contain 2, which is the last index element
// however, when the second index number is removed, the output might replace it with 6, which is the first index element
答案 0 :(得分:2)
首先,您已经使用了两种本机方法(myJsonObject
和floor
),但我假设您对此表示满意。
第二,在您的问题中,术语数字在某些情况下比数字更合适。有区别...
为避免仍然选择不允许的数字,可以首先使用仍然允许的数字构建一个数组,然后从那个数组中随机选择值。这样一来,您永远不会选错人。
这是它的外观:
random
只是为了好玩,如果您取消了对不能使用哪些语言方面的限制,可以按以下步骤进行操作:
const func = arg2 => {
const digits = [0,1,2,3,4,5,6,7,8,9];
// Mark digits that are not allowed with -1
for (let i=0; i<arg2.length; i++) {
digits[arg2[i]] = -1;
}
// Collect digits that are still allowed
const allowed = [];
for (let i=0; i<digits.length; i++) {
if (digits[i] > -1) allowed[allowed.length] = digits[i];
}
// Pick random digits from the allowed digits
let str = "";
for(let i=0; i<5; i++) {
str += allowed[Math.floor(Math.random() * allowed.length)];
}
return str;
}
console.log(func([6, 2]));
答案 1 :(得分:0)
每次选择一个随机数字时,您都需要遍历整个arg2
数组。您无法替换arg2
循环中的值,因为那样您就不会检查以前的元素了。
您不需要arr
数组,可以在循环中附加到str
。
const func = arg2 => {
let str = "";
let arr = [];
for (let i = 0; i < 5; i++) {
let random;
while (true) {
let ok = true;
random = Math.floor(Math.random() * 10);
for (let j = 0; j < arg2.length; j++) {
if (random == arg2[j]) {
ok = false;
break;
}
}
if (ok) {
break;
}
}
str += random
}
return str
}
console.log(func([6, 2]))
答案 2 :(得分:0)
我怀疑您对此太想了。基本算法是:
这很直接地映射到以下功能:
function fn(exclude, length = 5) {
let output = '';
while (output.length < length) {
const n = Math.floor(Math.random() * 10)
if (!exclude.includes(n)) {
output += n;
}
}
return output;
}
console.log(fn([6,3,8]));
当然,还有其他方法可以实现此目的,例如初始化包含五个元素的数组,然后join
元素:
function fn(exclude, length = 5) {
return Array.from({ length }, () => {
let n;
while (n = Math.floor(Math.random() * 10), exclude.includes(n)) {}
return n;
}).join('');
}
console.log(fn([6,3,8]));
答案 3 :(得分:0)
除了您自己使用本机数组方法的事实(其他人也说过)之外,我可能还会使用类似的方法(仅使用到目前为止使用的方法):
const func = without => {
let result = '';
while (result.length < 5) {
let rand = Math.floor(Math.random() * 10);
let add = true;
for (i=0; i<without.length; i++) {
if (rand === without[i]) {
add = false;
}
}
if (add) {
result += rand;
}
}
return result;
}
console.log(func([6, 2]))
使用本机数组方法的更简洁的版本如下所示:
const func = without => {
let result = '';
while (result.length < 5) {
let rand = Math.floor(Math.random() * 10);
if (!without.includes(rand)) {
result += rand;
}
}
return result;
}
console.log(func([6, 2]))