Java menjana 6 digit nombor rawak tidak berulang, tolong bantu kawan
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-06-28 09:23:14
0
5
1149

Saya tahu bahawa tiada kitaran tanpa pengulangan~, saya hanya boleh mengurangkan kadar pengulangan, tetapi saya masih perlu mencubanya~, adakah rakan Taois yang boleh mencuba saya~

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

membalas semua(5)
仅有的幸福

Saya rasa maksud rawak ialah kedua-dua nilai hasil tidak dapat diramalkan secara amnya, mengetahui A1 A2 tidak dapat menyimpulkan maksud A3.
Masalah nilai berulang yang anda sebutkan harus diukur dari perspektif kebarangkalian Jika kebarangkalian untuk mendapatkan setiap nilai adalah sama, ia bermakna "rawak". .

Jika anda mesti mengehadkan nilai dengan ketat untuk tidak diulang, anda perlu mempunyai tempat penyimpanan, dan bukan pendua ini juga mesti mempunyai julat masa atau ruang.

某草草

Saya sebelum ini melihat algoritma untuk menjana nombor tidak berulang secara rawak pada 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];//把随机数产生过的位置替换为未被选中的值。    
}  
阿神

Cara yang bodoh adalah dengan memulakan tatasusunan secara langsung, meletakkan setiap nombor pada kedudukan yang betul, dan kemudian secara rawak memilihnya Hasil pertama ditukar dengan digit terakhir, dan keputusan kedua ditukar dengan digit kedua hingga terakhir , selepas pertukaran, pemilihan rawak akan dibuat pada masa akan datang Julat nombor juga akan dikurangkan satu dengan sewajarnya.

Mengenai kecekapan, poster boleh melaksanakannya.

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

Jika kitaran hayat panjang, 100,000 akan mudah habis Selepas habis, ia akan berulang tidak kira bagaimana anda menjananya.

  1. Yang paling mudah, Math.random()*10_0000, dan kemudian tukar kepada int. Tiada jaminan ia tidak akan berulang

  2. kenaikan, serupa dengan kenaikan kunci utama mysql Bermula dari 1, jika terdapat kurang daripada enam digit, gunakan 0 untuk menambah bahagian hadapan

  3. .
  4. Mata lanjutan nombor enam digit boleh digabungkan menggunakan pelbagai faktor yang mempengaruhi Sudah tentu, nombor ini agak pendek, dan tidak banyak faktor yang perlu dipertimbangkan.

Akhir sekali, berikan pautan rujukan, penjanaan ID sistem yang diedarkan Ini mungkin tidak berkaitan dengan masalah anda, tetapi ia juga mempunyai rujukan.

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

0 hingga 100 ialah julat, 6 ialah nombor. Apa yang lebih penting ialah keselamatan benang.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan