第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Golang 加密洗牌

Golang 加密洗牌

Go
天涯盡頭無(wú)女友 2021-12-07 18:35:45
我正在嘗試在 Go 中實(shí)現(xiàn)一個(gè)字符串隨機(jī)播放函數(shù),它使用加密/蘭特而不是數(shù)學(xué)/蘭特。在費(fèi)雪耶茨洗牌需要隨機(jī)整數(shù),所以我一直在努力,實(shí)現(xiàn)該功能,而無(wú)需使用密碼/蘭特詮釋依賴(lài)于數(shù)學(xué)/大。以下是我目前想到的最好的方法,但有沒(méi)有更好的方法?我找不到現(xiàn)有示例的事實(shí)讓我想知道為什么沒(méi)有人這樣做是有充分理由的!package mainimport "crypto/rand"import "fmt"import "encoding/binary"func randomInt(max int) int {    var n uint16    binary.Read(rand.Reader, binary.LittleEndian, &n)    return int(n) % max}func shuffle(s *[]string) {        slice := *s        for i := range slice {                j := randomInt(i + 1)                slice[i], slice[j] = slice[j], slice[i]        }        *s = slice    }func main() {        slice := []string{"a", "b", "c", "d", "e", "f", "h", "i", "j", "k"}        shuffle(&slice)        fmt.Println(slice)}
查看完整描述

3 回答

?
慕尼黑8549860

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊

Go 的math/rand庫(kù)有很好的工具可以從Source.


// A Source represents a source of uniformly-distributed 

// pseudo-random int64 values in the range [0, 1<<63).


type Source interface {

    Int63() int64

    Seed(seed int64)

}

NewSource(seed int64)返回內(nèi)置的確定性 PRNG,但New(source Source)將允許滿(mǎn)足Source接口的任何內(nèi)容。


這是一個(gè)Source由crypto/rand.


type CryptoRandSource struct{}


func NewCryptoRandSource() CryptoRandSource {

    return CryptoRandSource{}

}


func (_ CryptoRandSource) Int63() int64 {

    var b [8]byte

    rand.Read(b[:])

    // mask off sign bit to ensure positive number

    return int64(binary.LittleEndian.Uint64(b[:]) & (1<<63 - 1))

}


func (_ CryptoRandSource) Seed(_ int64) {}

你可以這樣使用它:


r := rand.New(NewCryptoRandSource())


for i := 0; i < 10; i++ {

    fmt.Println(r.Int())

}

該math/rand庫(kù)具有正確實(shí)施的Intn()方法,可確保均勻分布。


func (r *Rand) Intn(n int) int {

    if n <= 0 {

        panic("invalid argument to Intn")

    }

    if n <= 1<<31-1 {

        return int(r.Int31n(int32(n)))

    }

    return int(r.Int63n(int64(n)))

}


func (r *Rand) Int31n(n int32) int32 {

    if n <= 0 {

        panic("invalid argument to Int31n")

    }

    if n&(n-1) == 0 { // n is power of two, can mask

        return r.Int31() & (n - 1)

    }

    max := int32((1 << 31) - 1 - (1<<31)%uint32(n))

    v := r.Int31()

    for v > max {

        v = r.Int31()

    }

    return v % n

}


func (r *Rand) Int63n(n int64) int64 {

    if n <= 0 {

        panic("invalid argument to Int63n")

    }

    if n&(n-1) == 0 { // n is power of two, can mask

        return r.Int63() & (n - 1)

    }

    max := int64((1 << 63) - 1 - (1<<63)%uint64(n))

    v := r.Int63()

    for v > max {

        v = r.Int63()

    }

    return v % n

}

加密散列函數(shù)也可以包裝為Source隨機(jī)性的替代方法。


查看完整回答
反對(duì) 回復(fù) 2021-12-07
?
FFIVE

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊

來(lái)自的數(shù)字n % max分布不均勻。例如,


package main


import (

    "fmt"

    "math"

)


func main() {

    max := 7

    size := math.MaxUint8

    count := make([]int, size)

    for i := 0; i < size; i++ {

        count[i%max]++

    }

    fmt.Println(count[:max])

}

輸出:


[37 37 37 36 36 36 36]


查看完整回答
反對(duì) 回復(fù) 2021-12-07
?
qq_花開(kāi)花謝_0

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊

根據(jù)收到的評(píng)論,我認(rèn)為我可以通過(guò)添加一個(gè) uniformInt 函數(shù)、填充一個(gè) uint32 而不是 uint16 并移除指向切片的指針來(lái)改進(jìn)我的問(wèn)題中的示例。


package main


import "crypto/rand"

import "fmt"

import "encoding/binary"


func randomInt() int {

        var n uint32

        binary.Read(rand.Reader, binary.LittleEndian, &n)

        return int(n)

}


func uniformInt(max int) (r int) {

        divisor := 4294967295 / max // Max Uint32

        for {

                r = randomInt() / divisor

                if r <= max {

                        break

                }

        }

        return

}


func shuffle(slice []string) {

        for i := range slice {

                j := uniformInt(i + 1)

                slice[i], slice[j] = slice[j], slice[i]

        }

}


func main() {

        slice := []string{"a", "b", "c", "d", "e", "f", "h", "i", "j", "k"}

        shuffle(slice)

        fmt.Println(slice)

}


查看完整回答
反對(duì) 回復(fù) 2021-12-07
  • 3 回答
  • 0 關(guān)注
  • 198 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)