`(seed * 9301 + 49297)%233280`ランダムアルゴリズムの元のソース?


9

シードされた(疑似)乱数ジェネレーターの作成例を検索すると、次のようなものに出くわします(特定の例http://indiegamr.com/generate-repeatable-random-numbers-in-js/):

// the initial seed
Math.seed = 6;

// in order to work 'Math.seed' must NOT be undefined,
// so in any case, you HAVE to provide a Math.seed
Math.seededRandom = function(max, min) {
    max = max || 1;
    min = min || 0;

    Math.seed = (Math.seed * 9301 + 49297) % 233280;
    var rnd = Math.seed / 233280;

    return min + rnd * (max - min);
}

これらの特定の番号(9301、49297、233280)とアルゴリズムは何度も使用されますが、これについての明確な参照を持つ人はいないようです。誰がこのアルゴリズムを発明し、ディストリビューションをテストしましたか?引用する紙や何かありますか?


5
これは線形合同ジェネレーターですが、かなり短い周期(32ビットintで許容されるのはわずか233kですが、40億周期を持っています
ラチェットフリーク

1
人々はしばしば本から直接コードをコピーするので、それはおそらくどこかで古い本からであり、何度かコピーされてきました。また、限定的なケースのようです。おそらく役立つ:heydari.persiangig.com/Ebooks/Applied_Crypto-Ch11-ch20.pdf/... ict.griffith.edu.au/anthony/info/C/RandomNumbers
barrycarter

2
起源が何であれ、それらは種を計算するために使用するためにひどい値です。

3
@jlarsonコメントは十分な長さではありませんが、2つの問題があります。第1に、ラチェットフリークが言及したように、モジュロは最大周期です。ジェネレータが繰り返す前の一意の数です。実際の期間は短くなる場合があります。第2に、他の2つの数値(主に被乗数)は、より長い周期を確保するために、モジュロ数に対して比較的素数でなければなりません。理想的には、剰余数はデータ型に適合する最大の正の整数よりも小さい最大の素数であり、他の2つの数値も大きな素数です。

1
これはサイドディスカッションであり、実際の回答を追加することはこの質問には適切ではないため、これらの数値がひどい理由の短いバージョンです。プログラマーでは技術的に疑似乱数アルゴリズムも話題になっていますが、詳細についてはWikipediaやおそらく数学コンピューターサイエンスを中心にバウンスすることをお勧めします。

回答:


7

Googleブックスをすばやく検索すると、これらの番号(9301、49297、233280)が多くの参照で使用されていることがわかります。

  • FORTRAN 77の数値レシピ
  • C ++の数値メソッドの概要
  • CGI開発者のリソース:TCLおよびPERLでのWebプログラミング
  • エンジニアと科学者のための効果的なFortran 77
  • JavaScript開発
  • Cのすべて
  • 一言で言えばJavaの例
  • セミナーのアルゴリズム
  • 力学の紹介

最も古いのは1977年代のGeorge Elmer Forsythe、Michael A. Malcolm、Cleve B. Moler(Prentice-Hall)による数学的計算のためコンピューターによる方法ですが、Googleは本のどこでテキストが使用されたかを示していないため、確認できません。

テキストを最も早く表示しているのは、「Pascalの数値レシピ(初版):Art of Scientific Computing、Volume 1、Press、Teukolsky、Vetterling、Flanryryによる「ポータブル乱数ジェネレータの定数」の全ページの表です。これらの特定の数値は、2 ^ 31のオーバーフローで示されます。

数値レシピブックのシリーズは非常に人気であり、1986年以降、印刷されてきました。


1
わあ、答えがここにない場合、どこにあるかわかりません。おかげで.////これらの数字がなぜ特別なのかについていくつかの特定の研究を指摘できるようにしたいと思っていましたが、これで十分です。9301は2つの素数(71x131)の積であり、49297は素数です-本来、私はそれが関連しているに違いないと感じています。233280は素数ではない-2x2x2x2x2x2x3x3x3x3x3x3x5(または2 ^ 6 * 3 ^ 5 * 5)に
等しい
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.