[解決済み] なぜdrand48()とその仲間たちは時代遅れなのか?
質問
結局のところ、これらは libc 標準の rand() よりも優れているようです。何か見落としているのでしょうか?
(この質問をネットで探すのに時間を費やしましたが、私が見つけた他の例は分布の偏りという文脈で、未回答のままでした)。
rand()とdrand48()のマニュアルページも矛盾しているように見えます。前者は後者を推奨し、後者は時代遅れで前者を使うべきと述べています。(しかし、公平を期すために、PRNGの背後にある数学を理解している多くの人々は、これらの関数のマニュアルページが不十分で、場合によっては間違っているので、問題を抱えています)。
それでも、quot;obsolete" の状態を正当化する理由が見つからないのです。
解決方法は?
アップデイト
:
drand48
と友人は
ではない
は廃止され、Man ページにはもう書かれていません。どうやら、この回答を受けて変更されたようです(ちょっとカッコイイですね)。
Linux の man ページを含む git リポジトリはこちらです。
https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git
該当するログエントリーは
commit 3db3ecf0ff358ab86ead91d767b8ef502bffe26b
Author: Michael Kerrisk <[email protected]>
Date: 2014-09-13 20:08:10 -0700
drand48.3: Remove crufty text about SVID 3 marking drand48() obsolete
See http://bugs.debian.org/758293
drand48() is in current POSIX. It's unclear why SVID 3 would
have marked it obsolete, but that's crufty information that
only serves to pointlessly worry people.
Reported-by: Lorenzo Beretta <[email protected]>
Signed-off-by: Michael Kerrisk <[email protected]>
こちらの不具合報告もご覧ください。 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=758293 変更のきっかけとなった
当初の回答は以下の通りです。
私のシステムのマニュアルページ(これは Linux man-pagesプロジェクト にはこう書かれています。
<ブロッククオート
これらの機能は、SVID 3によって廃止されることが宣言されており、次のように記述されています。
rand(3)
を使用する必要があります。
SVID 3は1989年に発行されたものです。
SVID 4
(リンク先は720ページのPDF)は、1995年に出版されたドキュメントです。
drand48
,
erand48
,
lrand48
,
nrand48
,
mrand48
,
jrand48
,
srand48
,
seed48
および
lcong48
であり、POSIXのように、それらが時代遅れであることについては何も述べていない。
POSIX 2013年時点では、時代遅れ、陳腐化、非推奨とは言っていません。
SVID 3 のコピーは見つかっていないので、わかりません なぜ しかし、どうやらその判断は後に見直されたようです。manページの記述は、古い情報のように思えます。私なら気にしない。
どの関数を使うべきかということについては、C言語規格の
rand()
関数が最も移植性が高いです(ソースコードから別のものを再コンパイルしない限り)。いくつかの
rand()
の実装は、低次ビットが非常に規則的なパターンで繰り返される質の悪いもので、他の実装は少し良いものです。
高品質な擬似乱数が必要でないなら、むしろ
rand()
(を呼び出すことでシードされる)。
srand()
を適当な値で、例えば
srand(time(NULL))
.
高品質な疑似乱数が必要な場合は、おそらく
なし
これらの関数のうち、暗号などに使うのはやめたほうがいいと思います。例えば
/dev/urandom
または
/dev/random
がサポートされている場合は、それを使用します。については、良いことを聞きました。
メルセンヌ・ツイスター
しかし、これ以上コメントする専門知識がありません。
(ちなみに、SVIDをGoogleで検索すると、以下のようなものが出てくるので気をつけてください。 スビド ).
関連
-
[解決済み】変数の警告が設定されているが使用されていない
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] 0から9までのランダムな整数を生成する
-
[解決済み] シェルコマンドを実行しながらエコーする方法
-
[解決済み] なぜJavaのVector(およびStack)クラスは時代遅れ、または非推奨とされているのですか?
-
[解決済み] C++のヘッダーファイルで#ifndefと#defineが使われているのはなぜですか?
-
[解決済み】大文字と数字を含むランダムな文字列の生成
-
[解決済み】なぜこれらのコンストラクトはプリインクリメントとポストインクリメントを使用して未定義の動作をしているのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み] テスト
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素