在Android中提供了一个用来产生随机数的工具类Random,通过Random.nextInt(int n)方法就可以在区间[0,n)等概率地产生一个伪随机数。通过这个方法,我们可以有效地解决一些等概率随机类的问题。
问题一:等概率生成[1,100]的100个随机数。
思路:用一个数组int[] array = new int[100]来容纳这些数据,并依次初始化成1,2,3……99,100。然后通过Random.nextInt(n+1)(n代表数组下标,位于[0,99])方法在区间[0,n]等概率地产生一个随机数m。然后,将a[n]与
a[m]中的数据进行交换,同时将产生随机数的截止区间减1(即Random.next(n)),开始产生下一个随机数。这样就相当于实现了为a[n]等概率生成了一个位于区间[1,100]的随机数,同时这个已经分配给a[n]的数字也不会在以后的随机数产生过程中再次出现了。具体实现如下:
int[] array = new int[100]; for (int i = 0; i < array.length; i++) { array[i] = i + 1; } for (int n = array.length - 1; n > 0; n--) { int m = new Random().nextInt(n + 1); //等概率产生[0,n]之间的一个随机数 if (m != n) { int temp = array[n]; array[n] = array[m]; array[m] = temp; } }
问题二:对于52张牌,实现一个随机打散扑克牌顺序的程序。
思路:同样,可以用一个数组来表示这52张牌,遍历这个数组,在剩下的数组元素里随机取出一个并与当前正在遍历的元素进行交换。这样,每次遍历完后的元素就不会参与到 下一次的随机抽取当中去了。具体实现只需要将上面程序当中的100改为52就可以了。