Javascript 重复加扰功能,直到输出与输入不同

Javascript 重复加扰功能,直到输出与输入不同,javascript,arrays,function,Javascript,Arrays,Function,我有一个javascript函数,它接受一个字符串并将字母置乱: function scramble(a){ a=a.split(""); for(var b=a.length-1;0<b;b--){ var c=Math.floor(Math.random()*(b+1));d=a[b];a[b]=a[c];a[c]=d; } return a.join("") } 功能加扰(a){ a=a.拆分(“”); 对于(var b=a.leng

我有一个javascript函数,它接受一个字符串并将字母置乱:

function scramble(a){
    a=a.split("");
    for(var b=a.length-1;0<b;b--){
        var c=Math.floor(Math.random()*(b+1));d=a[b];a[b]=a[c];a[c]=d;
    }
    return a.join("")
}
功能加扰(a){
a=a.拆分(“”);

对于(var b=a.length-1;0使用递归,在函数末尾,检查输出是否等于输入,如果是,则返回加扰(a);
如果不是,则返回加扰文本;


我还建议重命名变量以提高可读性,我上面的示例return语句假设您已经重命名了变量,并且无论您的加扰文本存储在哪个变量中,我都称之为
加扰文本
,您可以使用递归并再次调用函数,直到您知道您没有返回相同的str为止从开始时进行的随机标记。旁注:随机标记会创建一个全局变量
d
。尝试在标记新变量时使用
var

编辑:根据的建议,应该进行检查,以确保输入长度至少为2个字符,而不是在整个字符串长度上重复相同的字符。否则,我们将被置于无限循环中

功能加扰(a){
如果(a.长度<2 | | isAllRepeats(a))
返回a;
var b=a.拆分(“”);
对于(var i=b.length-1;0console.log(scramble(“AAAAA”)
递归方法是我们想到的方法,因此您可以按如下方式操作;然而概率是奇怪的,总是有(尽管非常罕见)概率被“鱼”卡住

功能加扰{
函数洗牌(a){
var i=a.长度,
J
tmp;
而(i>1){
j=Math.floor(Math.random()*i--);
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
返回a;
}
var t=shuffle([…s]).join(“”);
返回t==s?加扰:t;
}

控制台日志(加扰(“鱼”))
如果使用递归,可能还需要进行一些检查,以确定是否存在有效的解决方案。例如,任何长度为1的字符串,或只包含1个字符的字符串重复
n次
,都会给您带来错误。您还可以指定重试次数/限制来解决此问题。对于
xxx
,它仍然失败,但是这将由OP来解决。谢谢您的编辑,Gavin。@user3297291也为此添加了一个检查。谢谢您的建议。