需求
一次性獲取多個不重複的數字
go實現
尷尬的是,golang只能同一個種子取一個數。想了個笨辦法 for迴圈。但是緊接著又有問題了,N次請求返回的是同一組。難道隨機種子? 思路上死迴圈了。
func GetRandNodes(getAmount int, totalAmount int) []int { // 取節點 var nodes []int for i := 1; i <= getAmount; i++ { s := rand。NewSource(int64(i)) r := rand。New(s) println(i, “ttttt”, totalAmount, r。Intn(totalAmount)) nodes = append(nodes, r。Intn(totalAmount)) } return nodes}
#第一次輸出01 15 04 11#第二次依舊01 15 04 11
看了一下rand的實現,同一個種子且Intn同一個數字,他們的演算法是一致的,並不是新的隨機,可能跟phper的理解不太一樣。
更換實現方式
nano timestamp as seed
func GetRandNodes(getAmount int, totalAmount int) []int { // 取節點 var nodes []int for i := 1; i <= getAmount; i++ { nanoSecs := time。Now()。UnixNano() s := rand。NewSource(nanoSecs) r := rand。New(s) println(i, “ttttt”, totalAmount, r。Intn(totalAmount)) nodes = append(nodes, r。Intn(totalAmount)) } return nodes}
結果比較理想,go routine併發執行可能會有問題,實際需求也達不到這個量級。
redis 隨機獲取元素
127。0。0。1:6379> sadd test1 01 02 03 04 05 06(integer) 6127。0。0。1:6379> SRANDMEMBER test1 11) “05”127。0。0。1:6379> SRANDMEMBER test1 11) “02”127。0。0。1:6379> SRANDMEMBER test1 11) “04”127。0。0。1:6379> SRANDMEMBER test1 11) “03”127。0。0。1:6379> SRANDMEMBER test1 11) “03”127。0。0。1:6379> SRANDMEMBER test1 11) “04”127。0。0。1:6379> SRANDMEMBER test1 11) “04”127。0。0。1:6379> SRANDMEMBER test1 11) “06”127。0。0。1:6379> SRANDMEMBER test1 11) “05”127。0。0。1:6379> SRANDMEMBER test1 11) “01”127。0。0。1:6379> SRANDMEMBER test1 11) “02”127。0。0。1:6379> SRANDMEMBER test1 11) “03”
重複的機率有點大,如果結合程式碼邏輯,剔除掉存在的數字還是勉強可以實現,目測存在遞迴呼叫。