Shuffle
洗牌算法
输入N
输出0~N-1的乱序数组
再我没仔细想这个问题之前,都是这么做的
开个
bool[N]
每次随机出0~N-1一个数X
如果X未曾出现过,X就加到数组
这个算法
运气不好的话就出不来了
当然了,现代的随机数算法还是很高明的,避免了这种糟糕算法
高明的算法是
C++STL中shuffle的实现方法
http://www.cplusplus.com/reference/algorithm/shuffle/
i从后往前,每次随机一个0~i,然后交换
这样肯定是乱的并且O(N)实现
参考JS代码
function main(n) {
var a = [];
//返回min到max的整数,包括min,max
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
function initArray() {
for (var i = 0; i < n; i++) {
a.push(i);
}
}
function log() {
console.log(a);
}
function shuffle() {
for (var i = n - 1; i > 0; i--) {
var j = getRandomInt(0, i);
var t = a[i];
a[i] = a[j];
a[j] = t;
}
}
initArray();
shuffle();
log();
}
for (var i = 0; i < 10; i++) {
main(10);
}
没想到JS居然没有swap = =