1. ホーム
  2. c

[解決済み] なぜdrand48()とその仲間たちは時代遅れなのか?

2022-02-26 23:33:01

質問

結局のところ、これらは 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で検索すると、以下のようなものが出てくるので気をつけてください。 スビド ).