golang 的雞肋隨機數

需求

一次性獲取多個不重複的數字

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”

重複的機率有點大,如果結合程式碼邏輯,剔除掉存在的數字還是勉強可以實現,目測存在遞迴呼叫。