最終更新日時: 2025年10月23日 01時15分43秒 (JST)
Akira Takahashi が更新

履歴 編集

type-alias
<random>

# std::ranlux24(C++11)

    namespace std {
      using ranlux24 = discard_block_engine<ranlux24_base, 223, 23>;
    }

## 概要

`ranlux24`は、贅沢さレベル3のRANLUX(LUXury RANdom numbers)法エンジンである。
RANLUX法は、以下の特徴を持つ：

- 低速だが、高品質な乱数を生成する
- シードを系統的に選ぶ (例えばスレッド ID) と、特に初期において生成した値の間に線型の相関 (nearly affine dependence) がみられる。これを避けるには
  - `random_device` 等の非決定論的な乱数をシードとして使う
  - 最初の方の値を捨てる (少なくとも 2 × 23 = 46 個)

RANLUX法は、0から4までの贅沢さレベル(luxury level)が選択可能である。
レベルを高くするほど低速になるが、乱数の品質は高くなる。レベル4が最高品質となる。
標準では、レベル3の`ranlux24`および、レベル4の`ranlux48`が定義される。

モンテカルロ法によるシミュレーションに、よく使用される。

## 要件

`ranlux24`型オブジェクトをデフォルト構築した場合、10000番目に生成される擬似乱数の値は`9901578`であること。

## 乱数列の周期

10171

## サイズ

    24 * sizeof(uint_fast32_t)

## パフォーマンス

`minstd_rand`や`minstd_rand0`に比べて、5倍ほど遅い。

## シード、および生成される値の型

`uint_fast32_t`

## 例

    #include <iostream>
    #include <random>
    #include <cstdint>

    int main()
    {
      std::random_device seed_gen;
      std::uint32_t seed = seed_gen();
      std::ranlux24 engine(seed);

      for (int i = 0; i < 10; ++i) {
        std::uint32_t result = engine();
        std::cout << result << std::endl;
      }
    }

### 出力例

    14989051
    4145629
    9009933
    15957878
    252315
    15191713
    10652539
    8111899
    16296385
    3893002

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.2 ✅
- ICC: ??
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅, 2017 ✅

## 参照

- N1398 A Proposal to Add an Extensible Random Number Facility to the Standard Library
- Ranlux - Random number generator
- Uniform Random Numbers of Guaranteed Quality
- M. Matsumoto, et al., Common Defects in Initialization of Pseudorandom Number Generators, ACM Trans. Model. Comput. Simul. 17, 15 (2007)