背景:
随机生成点菜菜单,其中一个需求是不重复取随机数。
在网上看到一个比较好的算法,记录如下:
import java.util.Random; public class test { private static int RANGE = 10; private static int COUNT = 8; static int[] table = new int[RANGE]; public static void main(String[] args) { initTable(); int[] random = new int[COUNT]; random = getRandom(COUNT); for (int i = 0; i < COUNT; i++) { System.out.print(random[i] + ","); } } public static int[] getRandom(int count) { int end = RANGE; int[] result = new int[count]; Random random = new Random(); for (int i = 0; i < count; i++) { int r = random.nextInt(end); result[i] = table[r]; table[r] = table[end - 1]; end--; } return result; } public static void initTable() { for (int i = 0; i < RANGE; i++) { table[i] = i; } } }
1:建立一个备选数组table,假定下标值对应元素的值
2:从0~n-1中取得随机数r后,需要从备选数组table中剔除r,采取的办法是,将数组最后一个元素放到r的位置,下次随机的时候取0~n-2,这样便简单的将r剔除掉
感受:如果随机数范围一般大,此方法效率极高,无须像普通算法一样遍历判断重复。