仅有的幸福2017-06-28 09:25:14
我認為隨機的意義在於前後兩次的結果值不可預測,推廣說就是知道A1 A2 並不能推算出A3這個意思。
你說的重複值的問題應該從機率的角度來衡量,如果每個值獲取的機率都是相等的,就屬於」隨機「的意思了,兩次結果重複不能說明這就不夠」隨機「。
如果一定要嚴格限定取值不重複,你需要有一個儲存的地方,而且這個不重複也一定有個時間或空間的範圍。
某草草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];//把随机数产生过的位置替换为未被选中的值。
}
阿神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();
}
}
}
}
大家讲道理2017-06-28 09:25:14
生命週期長的話,十萬還是很容易就用完的.用完之後再怎麼生成也是重複的.
最簡單的, Math.random()*10_0000,然後轉int.無法保證不重複
遞增,類似mysql的主鍵遞增.從1開始,不足六位的話,前面用0補足
高級點.六位數可以用各種影響因素來進行組合,當然這個位數比較短,可考慮的因素不是很多.
最後,給一個參考連結,分散式系統ID產生. 這個可能跟你的問題沒有關係,但是也有一些參考性.
怪我咯2017-06-28 09:25:14
ThreadLocalRandom.current().ints(0, 100).distinct().limit(6).forEach(System.out::println);
0到100是範圍,6是個數。更重要的是線程安全。