生成不重複隨機數的演算法(其一)
阿新 • • 發佈:2019-02-09
背景:
隨機生成點菜選單,其中一個需求是不重複取隨機數。
在網上看到一個比較好的演算法,記錄如下:
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剔除掉
感受:如果隨機數範圍一般大,此方法效率極高,無須像普通演算法一樣遍歷判斷重複。