搜尋

首頁  >  問答  >  主體

java產生6位不重複隨機數,求救各位道友

我知道循環下去沒有不重複的~,只能降低重複率,但還是得戳一戳~,有沒有道友來一波~

曾经蜡笔没有小新曾经蜡笔没有小新2711 天前1123

全部回覆(5)我來回復

  • 仅有的幸福

    仅有的幸福2017-06-28 09:25:14

    我認為隨機的意義在於前後兩次的結果值不可預測,推廣說就是知道A1 A2 並不能推算出A3這個意思。
    你說的重複值的問題應該從機率的角度來衡量,如果每個值獲取的機率都是相等的,就屬於」隨機「的意思了,兩次結果重複不能說明這就不夠」隨機「。

    如果一定要嚴格限定取值不重複,你需要有一個儲存的地方,而且這個不重複也一定有個時間或空間的範圍。

    回覆
    0
  • 某草草

    某草草2017-06-28 09:25:14

    以前在CSDN上看到隨機產生不重複的數字的演算法:

    int startArray[] = {0,1,2,3,4,5,6,7,8,9};//seed array    
    int N = 6;//随机数个数    
    int resultArray[] = new int [N];//结果存放在里面    
    for(int i = 0; i < N; i++)    
    {    
        int seed = random(0, startArray.length - i);//从剩下的随机数里生成    
        resultArray[i] = startArray[seed];//赋值给结果数组    
        startArray[seed] = startArray[startArray.length - i - 1];//把随机数产生过的位置替换为未被选中的值。    
    }  

    回覆
    0
  • 阿神

    阿神2017-06-28 09:25:14

    一個笨辦法就是直接初始化數組,每個數字對號入座,然後隨機挑選,第一次的結果與倒數第一位交換,第二次的結果與倒數第二位交換,當然交換後,下次挑隨機數的範圍也會隨之減一。

    至於效率如何,樓主可以執行下。

    public static void main(String[] args) {
    
        // 初始化数组
        int[] arr = new int[1000000];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = i;
        }
    
        int randomCount = 1000;                         // 要生成多少个随机数
        Random random = new Random();                   // 随机数生成器
        long startTime = System.currentTimeMillis();    // 计时
    
        for (int i = 0; i < randomCount; i++) {
            // 随机挑选
            int pickIndex = random.nextInt(arr.length - i);
    
            // 交换
            int t = arr[pickIndex];
            arr[pickIndex] = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = t;
        }
    
        System.out.println("take time: " + (System.currentTimeMillis() - startTime) + " ms");
    
        // 输出结果(超过一万就不输出了,直接看耗时)
        if (randomCount < 10000) {
            for (int i = 0; i < randomCount; i++) {
                System.out.printf("%06d ", arr[arr.length - i - 1]);
                if (i % 40 == 39) {
                    System.out.println();
                }
            }
        }
    }

    回覆
    0
  • 大家讲道理

    大家讲道理2017-06-28 09:25:14

    生命週期長的話,十萬還是很容易就用完的.用完之後再怎麼生成也是重複的.

    1. 最簡單的, Math.random()*10_0000,然後轉int.無法保證不重複

    2. 遞增,類似mysql的主鍵遞增.從1開始,不足六位的話,前面用0補足

    3. 高級點.六位數可以用各種影響因素來進行組合,當然這個位數比較短,可考慮的因素不是很多.

    最後,給一個參考連結,分散式系統ID產生. 這個可能跟你的問題沒有關係,但是也有一些參考性.

    回覆
    0
  • 怪我咯

    怪我咯2017-06-28 09:25:14

    ThreadLocalRandom.current().ints(0, 100).distinct().limit(6).forEach(System.out::println);

    0到100是範圍,6是個數。更重要的是線程安全。

    回覆
    0
  • 取消回覆