一、Python代码参看
def shuffle(self, x, random=None, int=int):
"""x, random=random.random -> shuffle list x in place; return None.
Optional arg random is a 0-argument function returning a random
float in [0.0, 1.0); by default, the standard random.random.
"""
if random is None:
random = self.random
for i in reversed(xrange(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = int(random() * (i+1))
x[i], x[j] = x[j], x[i]
来计算一下概率。如果某个元素被放入第i (1 <= i <=n) 个位置,就必须是在前 i - 1 次选取中都没有选到它,并且第 i 次选取是恰好选中它。其概率为:
pi=n−1n×n−2n−1×⋯×n−i+1n−i+2×1n−i+1=1n
可见任何元素出现在任何位置的概率都是相等的。
二、JavaScript代码参看
/** 随机排列数组里的顺序 */
function randomArr(arr:Array):Array {
return arr.sort (function(){return Math.random ()>.5});
}
三、Java代码参看
Collections.shuffle(List<?> list)源码分析
public static void shuffle(List<?> list) {
if (r == null) {
r = new Random();
}
shuffle(list, r);
}
Collections.shuffle(List<?> list, Random rnd)
public static void shuffle(List<?> list, Random rnd) {
int size = list.size();
if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
for (int i=size; i>1; i--)
swap(list, i-1, rnd.nextInt(i));
} else {
Object arr[] = list.toArray();
// Shuffle array
for (int i=size; i>1; i--)
swap(arr, i-1, rnd.nextInt(i));
// Dump array back into list
ListIterator it = list.listIterator();
for (int i=0; i<arr.length; i++) {
it.next();
it.set(arr[i]);
}
}
}
Collections.swap(List<?> list, int i, int j)
public static void swap(List<?> list, int i, int j) {
final List l = list;
l.set(i, l.set(j, l.get(i)));
}
Collections.swap(Object[] arr, int i, int j)
/**
* Swaps the two specified elements in the specified array.
*/
private static void swap(Object[] arr, int i, int j) {
Object tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
四、本人另一篇博文:不重复的随机数