打乱一个没有重复元素的数组。
示例:
// 以数字集合 1, 2 和 3 初始化数组。 int[] nums = {1,2,3}; Solution solution = new
Solution(nums);// 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。 solution.shuffle();
// 重设数组到它的初始状态[1,2,3]。 solution.reset();
// 随机返回数组[1,2,3]打乱后的结果。 solution.shuffle();
思路:对于shuffle函数,从坐标0~len-2,一次与其后中的某一随机数(包括自己)坐标对应的数进行交换,从而完成洗牌算法。
public class Shuffle {
private int[] original;
public Shuffle(int[] nums) {
this.original = nums;
}
/** Resets the array to its original configuration and return it. */
public int[] shuffle() {
int []newNums = original.clone();
for(int i=0;i<newNums.length-1;i++) {
int j = (int) (Math.random()*(newNums.length-i)+i);
int temp = newNums[i];
newNums[i] = newNums[j];
newNums[j] = temp;
}
return newNums;
}
/** Returns a random shuffling of the array. */
public int[] reset() {
return this.original;
}
}
收获:
1、洗牌算法
2、得到[min,max)之间的某一随机数:result = Math.random()*(max-min)+min;