我正在学习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));
答案 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;
}
}