2015-04-27 2 views
3

Я хочу, чтобы заменить любые 3 случайные буквы из строки со случайными буквами от моего letters переменнойЗаменить 3 буквы из строки со случайными буквами

var str = "HELLO"; 
var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
var arr = str.split(''); 
for (var i = 0; i < 3; i++) { 
    var pos = Math.round(Math.random() * arr.length - 1); 
    arr.splice(Math.floor(Math.random() * arr.length), 1); 
    str = arr.join(''); 
} 
alert(str); 

Я могу взять 3 случайные буквы прямо сейчас, но не может понять, как получить 3 случайных буквы от letters и поместить их в случайную позицию.

Вот демонстрация того, что у меня есть сейчас.

http://jsfiddle.net/r1zd7rsw/

Любая помощь будет оценен по достоинству!

ответ

2

Я попытался более простой подход:

var str = "HELLO"; 
var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

var strArray = str.split(''); 
var lettersArray = letters.split(''); 

for (var i = 0; i < 3; i++) { 
    var pos1 = Math.round(Math.random() * (str.length - 1)); 
    var pos2 = Math.round(Math.random() * (letters.length - 1)); 
    strArray[pos1] = lettersArray[pos2]; 
} 

alert(strArray.join("")); 

DEMO: https://jsfiddle.net/erkaner/r1zd7rsw/7/

+0

Я думаю, что вы слишком упрощены. 'String.replace()' заменит первый экземпляр выбранной буквы, который не может быть экземпляром, который вы намеревались заменить. То есть, это не может быть экземпляр в 'pos1'. –

+0

Кроме того, это заставило меня понять, что ни ваше решение, ни моя защита не заменяют одно и то же положение более одного раза. Упс! –

+0

@SMcCrohan wavv вы правы! Я обновил его, я думаю, он должен работать сейчас. – renakre

1

Вы были почти там!

var str = "HELLO"; 
var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
var arr = str.split(''); 
for (var i = 0; i < 3; i++) { 
    var pos = Math.round(Math.random() * arr.length - 1); 
    var replacementPos = Math.round(Math.random() * letters.length); 
    arr.splice(Math.floor(Math.random() * arr.length), 1, letters[replacementPos]); 
    str = arr.join(''); 
} 
alert(str); 

Все, что вам не хватало используют тот же случайный метод выбора позиции против вашей другой строки, а затем использовать эту позицию, чтобы кормить замены символа в ваш slice() вызова.

Изменение вещи немного больше от оригинала, это было бы легче читать:

var str = "HELLO"; 
var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

var getPos = function(arr) { 
    return Math.floor(Math.random() * arr.length); 
} 

var arr = str.split(''); 
for (var i = 0; i < 3; i++) { 
    arr.splice(getPos(arr), 1, letters[getPos(letters)]); 
} 
str = arr.join(''); 
alert(str); 
2

Вы можете сделать

var str = "HELLO"; 
var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
var arr = str.split(''), 
    //a temp array to store already replaced locations 
    temp = [], 
    pos, char; 
for (var i = 0; i < 3; i++) { 
    //since you want 3 different chars to be replaced make sure the current position is not already replaced 
    do { 
     pos = Math.floor(Math.random() * arr.length); 
    } while (temp.indexOf(pos) > -1); 

    //find the new char, make sure it is not the same as the current character 
    do { 
     char = letters[Math.floor(Math.random() * letters.length)] 
    } while (arr[pos] == char); 

    //replace the character at position pos in the array arr, the character to be replaced is randomly selected from teh letters string 
    arr[pos] = char; 
    //store the current position in the temp array 
    temp.push(pos); 
} 
str = arr.join(''); 
console.log(str); 

Демо: Fiddle

+0

Nice - я проглядел необходимость убедиться в том, в таком же положении не был заменен более чем один раз. –

1
function randString(num, myStr) 
{ 
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    for(var i=0; i < num; i++){ 
     randChar = possible.charAt(Math.floor(Math.random() * possible.length)); 
     repChar = myStr.charAt(Math.round(Math.random() * myStr.length)); 
     myStr = myStr.replace(repChar, randChar ); 
    } 
    return myStr; 
} 

alert(randString(3, "12345")) 

DEMO http://jsfiddle.net/tuga/5h3jf3v0/2/

+0

Не думайте, что вы поняли мой вопрос правильно ... проверьте другие ответы, пожалуйста, – user4756836