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

王林
リリース: 2024-02-06 09:55:03
転載
390 人が閲覧しました

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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!