用随机字母替换字符串中的任意 3 个字母

Posted

技术标签:

【中文标题】用随机字母替换字符串中的任意 3 个字母【英文标题】:Replace any 3 letters from the string with random letters 【发布时间】:2015-07-05 08:38:22 【问题描述】:

我想用我的 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 个随机字母,但不知道如何从 letters 中取出 3 个随机字母并将它们放在随机位置。

这是我现在拥有的演示。

http://jsfiddle.net/r1zd7rsw/

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

我尝试了一种更简单的方法:

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(""));

演示:https://jsfiddle.net/erkaner/r1zd7rsw/7/

【讨论】:

我认为您过于简化了。 String.replace() 将替换所选字母的第一个实例,这可能不是您实际要替换的实例。也就是说,它可能不是pos1 的实例。 此外,这让我意识到,无论是您的解决方案还是我的解决方案,都不能避免多次替换同一个位置。哎呀! @SMcCrohan wavv 你是对的!我更新了它,我认为它现在应该可以工作了。 您的解决方案有时会给我一封额外的信 @erkaner @user4756836 终于明白了,再看代码,jsfiddle.net/erkaner/r1zd7rsw/7【参考方案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

【讨论】:

很好 - 我忽略了确保同一位置不会被多次替换的必要性。【参考方案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);
    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);

【讨论】:

【参考方案4】:
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"))

演示 http://jsfiddle.net/tuga/5h3jf3v0/2/

【讨论】:

不要认为你理解我的问题是正确的......请检查其他答案

以上是关于用随机字母替换字符串中的任意 3 个字母的主要内容,如果未能解决你的问题,请参考以下文章

根据具有 Character 类的字母,用数字替换字符串中的字母

c#用许多“x”替换字符串[重复]

HDU 3901 Wildcard

使用正则表达式替换字符串中的特定字母

python如何让给定字符串“abcdefg”中的3个字符变成大写并输出所有的可能?

Codeforces Round #425 B