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];//把随机数产生过的位置替换为未被选中的值。
}
我認為隨機的意義在於前後兩次的結果值不可預測,推廣說就是知道A1 A2 並不能推算出A3這個意思。
你說的重複值的問題應該從機率的角度來衡量,如果每個值獲取的機率都是相等的,就屬於」隨機「的意思了,兩次結果重複不能說明這就不夠」隨機「。
如果一定要嚴格限定取值不重複,你需要有一個儲存的地方,而且這個不重複也一定有個時間或空間的範圍。
以前在CSDN上看到隨機產生不重複的數字的演算法:
一個笨辦法就是直接初始化數組,每個數字對號入座,然後隨機挑選,第一次的結果與倒數第一位交換,第二次的結果與倒數第二位交換,當然交換後,下次挑隨機數的範圍也會隨之減一。
至於效率如何,樓主可以執行下。
生命週期長的話,十萬還是很容易就用完的.用完之後再怎麼生成也是重複的.
最簡單的, Math.random()*10_0000,然後轉int.無法保證不重複
遞增,類似mysql的主鍵遞增.從1開始,不足六位的話,前面用0補足
高級點.六位數可以用各種影響因素來進行組合,當然這個位數比較短,可考慮的因素不是很多.
最後,給一個參考連結,分散式系統ID產生. 這個可能跟你的問題沒有關係,但是也有一些參考性.
0到100是範圍,6是個數。更重要的是線程安全。