Lia*_*iam 40 javascript string
特别是,我想确保避免在Microsoft的Browser Choice shuffle代码中犯下的错误.也就是说,我想确保每个字母在每个可能的位置都有相同的概率.
例如,给定"ABCDEFG",返回类似"GEFBDCA"的内容.
And*_*y E 73
我修改了维基百科上的Fisher-Yates Shuffle条目中的一个示例来改变字符串:
String.prototype.shuffle = function () {
var a = this.split(""),
n = a.length;
for(var i = n - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
return a.join("");
}
console.log("the quick brown fox jumps over the lazy dog".shuffle());
//-> "veolrm hth ke opynug tusbxq ocrad ofeizwj"
console.log("the quick brown fox jumps over the lazy dog".shuffle());
//-> "o dt hutpe u iqrxj yaenbwoolhsvmkcger ozf "
Run Code Online (Sandbox Code Playgroud)
更多信息可参见乔恩斯基特的回答到是不是正确使用JavaScript的Array.sort()方法洗牌?.
Joe*_*lon 38
如果"真正"的随机性很重要,我建议不要这样做.请参阅下面的编辑.
我只想添加一些我最喜欢的方法;)
给定一个字符串:
var str = "My bologna has a first name, it's O S C A R.";
Run Code Online (Sandbox Code Playgroud)
洗牌一行:
var shuffled = str.split('').sort(function(){return 0.5-Math.random()}).join('');
Run Code Online (Sandbox Code Playgroud)
输出:
oa, a si'rSRn f gbomi. aylt AtCnhO ass eM
as'oh ngS li Ays.rC nRamsb Oo ait a ,eMtf
y alCOSf e gAointsorasmn bR Ms .' ta ih,a
Run Code Online (Sandbox Code Playgroud)
编辑:正如@PleaseStand指出的那样,这根本不符合OP的问题,因为它确实遭受了"微软的浏览器选择洗牌"代码.如果你的字符串需要接近随机,这不是一个非常好的随机函数.然而,令人敬畏的是快速"混乱"你的字符串,其中"真正的"随机性是无关紧要的.
他在下面链接的文章是一个很好的阅读,但解释了一个完全不同的用例,它影响统计数据.我个人无法想象在字符串上使用这个"随机"函数的实际问题,但作为一个编码器,你有责任知道何时不使用它.
我已经把它留给了那里的所有休闲随机发生器.
虽然已经回答了这个问题,但我想分享一下我提出的解决方案:
function shuffelWord (word){
var shuffledWord = '';
word = word.split('');
while (word.length > 0) {
shuffledWord += word.splice(word.length * Math.random() << 0, 1);
}
return shuffledWord;
}
// 'Batman' => 'aBmnta'
Run Code Online (Sandbox Code Playgroud)
你也可以尝试一下(jsfiddle).
最短的一个班轮:
const shuffle = v=>[...v].sort(_=>Math.random()-.5).join('');
Run Code Online (Sandbox Code Playgroud)
不保证统计上的平均分布,但在大多数情况下对我来说是可用的。
const shuffle = v=>[...v].sort(_=>Math.random()-.5).join('');
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
38111 次 |
最近记录: |