如何修复函数以检查相同的随机数组值

时间:2019-05-18 08:13:51

标签: javascript arrays

我正在学习JavaScript,我已经能够创建一个具有参数的函数,该函数的任务是形成一个包含2个字符(0/1)随机字符串和1个参数的数组,并且返回值必须为数组。 例如:

console.log (generateString(2));

样本结果:

['01', '11']

我面临的问题是,尽管它是一个随机字符串,但是仍然有可能具有相同的值。假设我运行程序代码

console.log (generateString(4));

其中一个结果是这样的:

['00', '00', '01', '10']

我的问题是如何确保数组的返回值没有重复值?到目前为止,这是我的代码。

function generateString(num){

        let newArray = [];
        for(let i = 0; i < num; i++){
            let randomChar = generateCharacters();
            if(i >= 1 && (newArray[i - 1] === randomChar)){
                randomChar = generateCharacters();
                newArray.push(randomChar);
            } else {
                newArray.push(randomChar);
            }

        }
        return newArray;
    }

    function generateCharacters(){
        const chars = '01';
        let result = '';
        for (let j = 2; j > 0; --j){
            result += chars[Math.floor(Math.random() * chars.length)];
        }
        return result;
    }

    console.log(generateString(4));

5 个答案:

答案 0 :(得分:2)

您可以在do-while内使用for-loop并继续制作新的随机字符串,直到生成的新字符串不包括在先前的数组中为止。

function generateString(num){

        let newArray = [];
        let randomChar;
        for(let i = 0; i < num; i++){
            do{
              randomChar = generateCharacters();
            }
            while(newArray.includes(randomChar));
            newArray.push(randomChar)

        }
        return newArray;
    }

    function generateCharacters(){
        const chars = '01';
        let result = '';
        for (let j = 2; j > 0; --j){
            result += chars[Math.floor(Math.random() * chars.length)];
        }
        return result;
    }

    console.log(generateString(4));

答案 1 :(得分:1)

您可以重新排列所有4位可能的数字对的数组:

function shuffle(a) {
    for (let i = a.length - 1; i > 0; i--) {
        let j = Math.floor(Math.random() * (i + 1));
        let temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    return a;
}

function generateString(num){
    let all = ["00", "01", "10", "11"];
    shuffle(all);
    return all.slice(0, num); // Only take the number of elements requested
}

console.log(generateString(4));

答案 2 :(得分:1)

只需在添加新字符串之前检查重复项即可。

function generateString(num){

        let newArray = [];
		let i =0;
        while(i<num){
          console.log(newArray)
            let randomChar = generateCharacters();
            if(newArray.indexOf(randomChar)<=-1){
              
                newArray.push(randomChar);
				        i+=1;
            }

        }
        return newArray;
    }

答案 3 :(得分:0)

您的generateCharacters函数进行了更改。您可以使用set来不更新结果中的重复项。我认为您需要更新function generateString(num){ let newArraySet = new Set(); for(let i = 0; i < num; i++){ let randomChar = generateCharacters(); while(newArraySet.has(randomChar)) { randomChar = generateCharacters(); } newArraySet.add(randomChar); } return Array.from(newArraySet); } function generateCharacters(){ const chars = '01'; let result = ''; for (let j = 2; j > 0; --j){ result += chars[Math.floor(Math.random() * chars.length)]; } return result; } console.log(generateString(4));函数以正确生成所有可能的字符串。

{{1}}

答案 4 :(得分:0)

在构建数组时,需要先检查随机数是否在数组中,然后再将其添加到数组中。如果将有问题的数组和需要检查的“随机”项送入该函数,则此函数将返回true。

function isInArray(myArray, arrayItemToCheck)
{
  var found = myArray.find(function(arrayItem) {
    return arrayItem == arrayItemToCheck;
  });
  return !!found
}

在您的函数中,将行let randomChar = generateCharacters();更改为:

let randomChar;
// loops forever until condition is met
while (true) {
    randomChar = generateCharacters();
    if (!isInArray(newArray, randomChar)) {            
        break;
    } 
}