AMDの乱数生成命令、なぜか「0」が出ない現象が海外で議論に

姉妹サイトの新着

他サイトの新着

Hacker Newsで、AMDのプロセッサに搭載された乱数生成命令RDRAND・RDSEEDが「0」を一切返さないように見えるとの報告が話題になった。投稿者はZen 2のCPUで11時間かけて16bit整数を生成し続けたところ、本来1/65536の確率で出るはずの0が一度も現れず、同じプログラムをIntel製CPUで動かすと普通に0が出たという。スレッドでは、検証工程で0のケースが見落とされたオフバイワンのバグではという推測や、そもそも「ランダムとは何か」を巡る議論、過去にもAMDのRDRAND・RDSEEDに偏りがあった経緯を指摘する声が交わされた。

AMDの乱数生成器は0を生成できない?

出典: board.flatassembler.net / 元記事はこちら

6 海外の名無しさん 2026-09-22 10:24
Zen 3チップで16bit値のゼロを確認してる(+1:3821, 0:3893, -1:3895)。統計的に十分なサンプルが集まったら32bit版もスレッドで報告する。もしかしてZen 2以降で直ってる?
28 海外の名無しさん 2026-09-22 11:39
>>6
数千台のZen2チップを積んだHPCクラスタにアクセスできる人いない?64bit版もチェックしたいけど、マシンの規模次第で数年はかかりそう。シュツットガルトのハイパフォーマンスコンピューティングセンターの人、72万320コアのZen2で遊んでくれない?
7 海外の名無しさん 2026-09-22 10:53
これだけ大量のハードウェア検証をしてるのに、こういうバグがどうしてすり抜けるのか毎回不思議に思う。業界のこの部分については全然知らないけど、どう見逃されたのか知りたい
29 海外の名無しさん 2026-09-22 14:06
>>7
自分も同感。モジュール同士の想定外の相互作用で起きるハードウェアバグなら理解できる。でもこれは「たった一つの仕事すら果たせていない」レベルの話
31 海外の名無しさん 2026-09-22 13:04
>>7
ほぼ間違いなくオフバイワン(境界値)のバグだろうね
32 海外の名無しさん 2026-09-22 12:41
>>7
検証計画で「0」というビンをカバー対象に入れてなかったんだろう
10 海外の名無しさん 2026-09-22 11:59
乱数生成器が自然に0を出したら、それはそれで心配になる
34 海外の名無しさん 2026-09-22 12:23
>>10
乱数生成器が自然に1を出したら、自分はそれはそれで心配になる
11 海外の名無しさん 2026-09-22 10:55
それがどうした? 大事なのは予測不能であることであって、範囲内の全ての数字を全く同じ確率で選ぶことじゃない。16542が一度も出なかったら問題になるか?
37 海外の名無しさん 2026-09-22 11:04
>>11
何を言ってるんだ? まさに「範囲内の全ての数字を全く同じ確率で選ぶこと」こそが本質だよ。Intel SDMの7.3.17節と、それが参照しているNIST SP800-90Aの「乱数」の定義を見てみるといい
38 海外の名無しさん 2026-09-22 12:39
>>11
「ランダム」という言葉を大半の人は「均等な分布でのランダム」という意味で使っている。歪んだサイコロも「ランダム」ではあるけど分布は偏ってる。これは実質、2^16面の重み付きサイコロってこと
39 海外の名無しさん 2026-09-22 11:13
>>11
経理のベティが黙ってないぞ
13 海外の名無しさん 2026-09-22 10:22
正規分布で考えれば、0が出る確率はもともとかなり低い。つまり「0を生成できない」んじゃなくて、単に0が出るほど十分な回数を試行していないだけかもしれない
43 海外の名無しさん 2026-09-22 10:28
>>13
見たところ16bit整数を生成しようとしていたみたいだから、確率は1/65536で、しかも11時間もテストを回してる。一様分布なら他のどの数字ともほぼ同じ回数の0が出るはずで、明らかに0だけ出ないのはおかしい
44 海外の名無しさん 2026-09-22 10:32
>>13
これは16bitでも32bitでも起きてるみたいだから、0くらい簡単に出てきてもいいはず。しかも本人たちはこう書いてる。『同じプログラムをIntelのプロセッサで動かすと、0は問題なく出てくる』
45 海外の名無しさん 2026-09-22 10:25
>>13
なんで正規分布だと思うんだ?
14 海外の名無しさん 2026-09-22 11:18
0は数じゃない、未定義だ
46 海外の名無しさん 2026-09-22 12:21
>>14
は? 何の話?
17 海外の名無しさん 2026-09-22 10:36
>>2
return 4 # サイコロを振って公正に決めました(ネタ)
50 海外の名無しさん 2026-09-22 11:24
>>17
これを見るといつもこれを思い出す https://www.reddit.com/r/ProgrammerHumor/comments/5yhl93/…
19 海外の名無しさん 2026-09-22 13:20
>>2
記憶が正しければ、うちで持ってた全Linuxサーバーには、AMD CPUのこの手のバグのせいでCPUをカーネルの乱数シード源から外す設定を入れてた。GRUB_CMDLINE_LINUXに`random.trust_cpu=off nordrand`を入れてたよ
52 海外の名無しさん 2026-09-22 13:29
>>19
悪い乱数源を足しても、良い乱数源の質が落ちることはないんじゃない? カーネルは怪しい乱数源が加わったからといって、既存のものを置き換えたりはしないと思ってた。例えば乱数源AとBをXORしたら、最悪でもAとBのうち良い方と同じ品質にはなるはず
20 海外の名無しさん 2026-09-22 10:59
>>2
rdrand32を呼んで下位16bitだけ取り出しても0は出る? 16bitレジスタに書き込むバージョンの命令自体のバグなのか、それとも元のRNG自体のバグなのか気になってる
53 海外の名無しさん 2026-09-22 11:00
>>20
出るよ。最初はrdrand32()%65535を試して、期待通りの頻度で0が出たから、自分のCPUにはこの問題がないと勘違いしてた
74 海外の名無しさん 2026-09-22 11:04
>>53
マスクするなら&0xFFFFを使うべきだよ。あとmodも1つずれてる
75 海外の名無しさん 2026-09-22 11:01
>>53
rdrand32()%65536の方がいいのでは? 65535で割った余りだと下位16bitにはならないから(※前回書き忘れた言葉があった、の訂正)
23 海外の名無しさん 2026-09-22 11:27
>>3
これって/dev/(u)randがやってることと実質同じでは? 複数の乱数源をプールしてこういう問題に備えるっていう。単一の乱数源に頼るのも、自前で実装するのも、どちらも避けるべき理由がわからない
55 海外の名無しさん 2026-09-22 12:30
>>23
そう、今どきのシステムならカーネル提供の乱数源を使うべき。自前で実装していい正当な理由があるとしたら、カーネルAPIが使えない組み込みシステムやブートローダーくらい
26 海外の名無しさん 2026-09-22 11:11
>>4
投稿者はZen 2でこれを発見したと言っていて、それはそのセキュリティ情報の対象には入っていないのでは(?) 追記: あと、その情報はRDSEEDのゼロについてだけで、投稿者はRDRANDのゼロも報告している
58 海外の名無しさん 2026-09-22 11:41
>>26
もっと古いAMDのプロセッサでも同様の問題があった: https://github.com/systemd/systemd/pull/12536/commits/…
85 海外の名無しさん 2026-09-22 12:34
>>58
なんでsystemdはカーネル提供の乱数インターフェースを使わずに、アーキテクチャ固有の命令を直接使ってるんだ?
86 海外の名無しさん 2026-09-22 12:28
>>58
それはなかなかタチが悪い話! その件のスレッドを見つけた → https://news.ycombinator.com/item?id=19848953 こんな発言もあった。『Intelのエンジニアから、Linuxの/dev/randomをRDRAND命令の出力に盲目的に頼らせるよう圧力を受けたが、抵抗しておいて本当によかった』―Theodore Ts'o (2013年)

他サイトの新着

51 海外の名無しさん 2026-09-22 10:43
>>17
知らない人のために https://xkcd.com/221/
71 海外の名無しさん 2026-09-22 10:50
62 海外の名無しさん 2026-09-22 11:39
>>36
値の範囲は2^16, 2^32, 2^64ではなく、2^16-1, 2^32-1, 2^64-1になるってだけの話。このバグの実害はゼロだよ
88 海外の名無しさん 2026-09-22 11:47
>>62
『偏った乱数生成器に実害はゼロ』というのは完全に誤り。現代の暗号技術には、比較的小さな偏りが致命的な破綻につながった例がいくつもある。例えばBleichenbacherの攻撃を調べてみるといい。今回の偏りが小さすぎて実際には悪用できない、というのは正しいかもしれないけど、これまでの経緯を踏まえれば「些細な話」と片付けるのは間違ってる
64 海外の名無しさん 2026-09-22 11:40
>>39
経理のベティがRNGなんかを気にする理由がある?
89 海外の名無しさん 2026-09-22 12:48
>>64
0が出ないことでどこかのエッジケースが実ユーザーに影響することはあるはず。予測シミュレーションとか?
65 海外の名無しさん 2026-09-22 12:02
>>43
『一様分布なら他の数字と同じくらいの頻度で0が出るはず』って言うけど、そもそも乱数がどうして一様分布になると言えるんだ?
90 海外の名無しさん 2026-09-22 12:23
>>65
どの数字も他のどの数字とも同じ確率で出るからだよ。特定の数字が出やすい、あるいは今回みたいに特定の数字が絶対に出ないとわかっているなら、それは定義上『よりランダムでない』ってこと

この話題の背景と論点

RDRANDとRDSEEDは、CPUに内蔵されたハードウェア乱数生成命令で、OSの乱数プール(Linuxの/dev/random相当)のシード元としても使われる。スレ中で触れられている「そのセキュリティ情報」は、AMDが過去にZen系CPUのRDSEEDで0が偏って出る不具合を認めた文書を指しており、今回の投稿者はより古いZen 2かつRDRANDでも同様の現象を確認したとして話題になった。論点は大きく二つに分かれた。一つは技術的な原因で、検証工程がゼロという値のケースを想定していなかった「境界値の見落とし」ではという推測が有力視された。もう一つは「乱数の定義」を巡る議論で、単に予測不能であればよいという立場と、暗号用途では全ての値が均等な確率で出ることが前提という立場が対立した。後者の文脈では、わずかな偏りでも暗号解読につながった実例(Bleichenbacher攻撃)が引き合いに出されており、「実害はない」と楽観視する意見への反論として機能していた。

※本記事は5ch(Hacker News)スレッド「AMD’s random number generator can’t generate a 0?」より抜粋・要約して構成しています。

この記事のリアクション

他サイトの新着

まだコメントはありません。

コメントする

誹謗中傷・個人を特定する書き込みは削除対象です。投稿は承認後に表示されます。

相互リンクサイト新着記事