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~
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.
Yang paling mudah, Math.random()*10_0000, dan kemudian tukar kepada int. Tiada jaminan ia tidak akan berulang
kenaikan, serupa dengan kenaikan kunci utama mysql Bermula dari 1, jika terdapat kurang daripada enam digit, gunakan 0 untuk menambah bahagian hadapan
.
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.
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:
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.
Jika kitaran hayat panjang, 100,000 akan mudah habis Selepas habis, ia akan berulang tidak kira bagaimana anda menjananya.
Yang paling mudah, Math.random()*10_0000, dan kemudian tukar kepada int. Tiada jaminan ia tidak akan berulang
kenaikan, serupa dengan kenaikan kunci utama mysql Bermula dari 1, jika terdapat kurang daripada enam digit, gunakan 0 untuk menambah bahagian hadapan
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.
0 hingga 100 ialah julat, 6 ialah nombor. Apa yang lebih penting ialah keselamatan benang.