java產生6位不重複隨機數,求救各位道友
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-06-28 09:23:14
0
5
1150

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

曾经蜡笔没有小新
曾经蜡笔没有小新

全部回覆(5)
仅有的幸福

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

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

某草草

以前在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];//把随机数产生过的位置替换为未被选中的值。    
}  
阿神

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

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

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();
            }
        }
    }
}
大家讲道理

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

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

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

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

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

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

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板