Go の crypto/rand
パッケージの Prime 関数 (可能な素数を生成する) では、 # を呼び出します。 crypto/internal/randutil
パッケージ内の ##MaybeReadByte 関数 (以下を参照)。関数の説明に基づいて、これが使用される理由は理解できますが、この実装がバイトを読み取る確率が 50% である理由がわかりません。
case の 1 つが他のものよりも先に実行されることが保証されるべきではないでしょうか?
var ( closedChanOnce sync.Once closedChan chan struct{} ) // MaybeReadByte reads a single byte from r with ~50% probability. This is used // to ensure that callers do not depend on non-guaranteed behaviour, e.g. // assuming that rsa.GenerateKey is deterministic w.r.t. a given random stream. // // This does not affect tests that pass a stream of fixed bytes as the random // source (e.g. a zeroReader). func MaybeReadByte(r io.Reader) { closedChanOnce.Do(func() { closedChan = make(chan struct{}) close(closedChan) }) select { case <-closedChan: return case <-closedChan: var buf [1]byte r.Read(buf[:]) } }
仕様によると:
両方のcase は同じチャネルを読み取るため、常に同時に行うことができます。
以上がMayaReadByte のチャネルの使用により、Go でどのように「ランダム」動作が実現されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。