ホームページ  >  記事  >  バックエンド開発  >  MayaReadByte のチャネルの使用により、Go でどのように「ランダム」動作が実現されるのでしょうか?

MayaReadByte のチャネルの使用により、Go でどのように「ランダム」動作が実現されるのでしょうか?

王林
王林転載
2024-02-06 09:55:03395ブラウズ

MaybeReadByte 对通道的使用如何在 Go 中提供“随机”行为?

質問の内容

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 サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。