数组随机洗牌

一、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=n1n×n2n1××ni+1ni+2×1ni+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;
    }

四、本人另一篇博文:不重复的随机数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值