各位好,我是剛學習JAVA沒多久的生手。
以下是我看到的網站
[JAVA]產生不重複之亂數,網址如下:
https://4xsc.com/java-random/
我的疑問點是圖面中紅線的地方
random的用法我是知道了,但是為何要打10-i?
以及
for(int j = n; j < num.length - 1; j++)
{
num[j] = num[j+1];
}
這一段的length為何要-1?
這個我研究了快一個晚上還是想不出來,只好請各位大大幫忙解答。
感謝!
程式運行:
初值
num 1 2 3 4 5 6 7 8 9 10
arr 0 0 0 0 0
random n = 5
num 1 2 3 4 5 7 8 9 10 10
arr 6 0 0 0 0
random n = 5
num 1 2 3 4 5 8 9 10 10 10
arr 6 7 0 0 0
random n = 3
num 1 2 3 5 8 9 10 10 10 10
arr 6 7 4 0 0
10-i
是因為要讓每次取 num 陣列的範圍變小,
以上面結果來說明,可以理解成不要取重複 10 的部分。
num.length - 1
是因為在把 num 往前移動時,如果不減一,j 在最尾端時 num[j+1] 就會超出陣列範圍。
實做上java有list,可以把元素取出,這樣會比較直觀。
然後在python只要這樣就行了,我是來亂的。
import random
print(random.sample(range(10), 5))
沒錯,這篇有點再寫 C++ 的感覺,一切都很原始 XD
force:
Java用list是這個方法嗎?
這網頁內的Collection移出法:
http://puremonkey2010.blogspot.tw/2012/11/java-java_26.html
python能夠用這一段達成亂數取值不重複?!
好簡潔有力!
fysh711426:
所以這個邏輯是從C++來的嗎?
哈哈,不是這麼說,
是以前在學 C++ 時很多東西都要自己做,很原始,
寫 JAVA 和 C# 後就很少用到陣列,
會用其他資料結構替代,例如 force 大大說的 list,
當然 C++ 也有類似的東西 STL,只是以前剛學習,沒有碰到這些。