Skip to content

Commit

Permalink
残りを書いた
Browse files Browse the repository at this point in the history
  • Loading branch information
faithandbrave committed Dec 19, 2024
1 parent 8d4868e commit aa08e11
Show file tree
Hide file tree
Showing 14 changed files with 844 additions and 2 deletions.
3 changes: 3 additions & 0 deletions reference/random.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
| [`linear_congruential_engine`](random/linear_congruential_engine.md) | 線形合同法(class template) | C++11 |
| [`mersenne_twister_engine`](random/mersenne_twister_engine.md) | メルセンヌツイスター法(class template) | C++11 |
| [`subtract_with_carry_engine`](random/subtract_with_carry_engine.md) | キャリー付き減算法(class template) | C++11 |
| [`philox_engine`](random/philox_engine.md) | カウンタベース乱数生成器のPhilox法(class template) | C++26 |


## 生成器アダプタ
Expand Down Expand Up @@ -62,6 +63,8 @@
| [`ranlux24`](random/ranlux24.md) | RANLUX法のレベル3(type-alias) | C++11 |
| [`ranlux48`](random/ranlux48.md) | RANLUX法のレベル4(type-alias) | C++11 |
| [`knuth_b`](random/knuth_b.md) | KnuthのリオーダーアルゴリズムB(type-alias) | C++11 |
| [`philox4x32`](random/philox4x32.md) | Philoxの32ビット版(type-alias) | C++26 |
| [`philox4x64`](random/philox4x64.md) | Philoxの64ビット版(type-alias) | C++26 |
| [`default_random_engine`](random/default_random_engine.md) | 非専門用途でデフォルト使用する擬似乱数生成器(type-alias) | C++11 |


Expand Down
1 change: 1 addition & 0 deletions reference/random/philox4x32.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ namespace std {
## 備考
- ここではラウンド数として`r = 10`を設定している。この値を大きくすれば乱数の品質は向上し、統計的により良い分布になっていく。`10`という値は既知の統計検定の合格する最小値よりやや大きめであり、広く使用されている値である。言い換えれば、適度な性能コストで統計的な安全マージンを提供している
- `r = 7`でも統計的な欠陥は見つかっていないが、実際には`r = 10`だけが広く使われている
## 例
Expand Down
1 change: 1 addition & 0 deletions reference/random/philox4x64.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ namespace std {
## 備考
- ここではラウンド数として`r = 10`を設定している。この値を大きくすれば乱数の品質は向上し、統計的により良い分布になっていく。`10`という値は既知の統計検定の合格する最小値よりやや大きめであり、広く使用されている値である。言い換えれば、適度な性能コストで統計的な安全マージンを提供している
- `r = 7`でも統計的な欠陥は見つかっていないが、実際には`r = 10`だけが広く使われている
## 例
Expand Down
56 changes: 54 additions & 2 deletions reference/random/philox_engine.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ namespace std {
* philox4x64[link philox4x64.md]
## 概要
`philox_engine`クラスは、カウンターベースのPhilox法による擬似乱数生成エンジンである
`philox_engine`クラスは、カウンターベースの乱数アルゴリズム (Counter-based random number generator, CBRNG) のPhilox法による擬似乱数生成エンジンである
Philox法は、以下のような特徴を持つ:
Expand Down Expand Up @@ -162,6 +162,7 @@ $ r \cdot w $ ビット
## 例
### 基本的な使い方
```cpp example
#include <iostream>
#include <random>
Expand All @@ -184,7 +185,7 @@ int main()
* std::uint32_t[link /reference/cstdint/uint32_t.md]
* engine()[link philox_engine/op_call.md]

### 出力例
#### 出力例
```
717409690
3816001420
Expand All @@ -198,6 +199,57 @@ int main()
859307553
```


### 多次元の乱数を生成する例
```cpp example
#include <print>
#include <random>

struct Vector {
float x, y, z;
};

int main()
{
uint32_t seed = 12345;
std::philox4x32 engine;

// 4x4x4個のランダムなベクトルを生成する
for (uint32_t x = 0; x < 2; ++x) {
for (uint32_t y = 0; y < 2; ++y) {
for (uint32_t z = 0; z < 2; ++z) {
engine.seed(seed);
engine.set_counter({x, y, z, 0});

std::uniform_real_distribution<float> dist{0, 1.0};

Vector vec {
dist(engine),
dist(engine),
dist(engine)
};
std::println("{},{},{}", vec.x, vec.y, vec.z);
}
}
}
}
```
* set_counter[link philox_engine/set_counter.md]
* uniform_real_distribution[link /reference/random/uniform_real_distribution.md]
* std::uint32_t[link /reference/cstdint/uint32_t.md]
#### 出力例
```
0.8202247,0.18554558,0.8234037
0.4850654,0.9281539,0.43299365
0.26559144,0.98589313,0.31661463
0.88831127,0.4234704,0.9224362
0.0027833676,0.14429614,0.8929877
0.6186795,0.6290597,0.46478647
0.17204352,0.54567194,0.1469554
0.7067667,0.48607737,0.6880201
```
## バージョン
### 言語
- C++26
Expand Down
77 changes: 77 additions & 0 deletions reference/random/philox_engine/discard.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# discard
* random[meta header]
* std[meta namespace]
* philox_engine[meta class]
* function[meta id-type]
* cpp26[meta cpp]

```cpp
void discard(unsigned long long z);
```
## 概要
指定した回数だけ擬似乱数を生成し、内部状態を進める。
## 効果
`*this`を`e`とした場合、
```cpp
for (unsigned long long i = 0; i < z; ++i) {
e();
}
```
* e()[link op_call.md]

と同じ効果を持つ。

指定された回数だけ乱数生成を行い、結果を破棄する。


## 戻り値
なし


##
```cpp example
#include <iostream>
#include <random>

int main()
{
std::philox4x32 engine;

for (int i = 0; i < 5; ++i) {
engine();
}

std::cout << engine() << std::endl;

// エンジンを再初期化し、内部状態を5回進める
// 上のコードで生成した乱数と同じ結果が得られる
engine.seed();
engine.discard(5);

std::cout << engine() << std::endl;
}
```
* discard[color ff0000]
* engine()[link op_call.md]
* seed()[link seed.md]

### 出力
```
3200855668
3200855668
```

## バージョン
### 言語
- C++26

### 処理系
- [Clang](/implementation.md#clang): 19 [mark noimpl]
- [GCC](/implementation.md#gcc): 14 [mark noimpl]
- [ICC](/implementation.md#icc): ??
- [Visual C++](/implementation.md#visual_cpp): ??

51 changes: 51 additions & 0 deletions reference/random/philox_engine/max.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# max
* random[meta header]
* std[meta namespace]
* philox_engine[meta class]
* function[meta id-type]
* cpp26[meta cpp]

```cpp
static constexpr result_type max();
```

## 概要
生成し得る値の最大値を取得する。


## 戻り値
`2^w - 1`を返す。


## 計算量
定数時間


##
```cpp example
#include <iostream>
#include <random>

int main()
{
std::uint32_t max_value = std::philox4x32::max();
std::cout << max_value << std::endl;
}
```
* max()[color ff0000]
* std::uint32_t[link /reference/cstdint/uint32_t.md]

### 出力
```
4294967295
```

## バージョン
### 言語
- C++26

### 処理系
- [Clang](/implementation.md#clang): 19 [mark noimpl]
- [GCC](/implementation.md#gcc): 14 [mark noimpl]
- [ICC](/implementation.md#icc): ??
- [Visual C++](/implementation.md#visual_cpp): ??
51 changes: 51 additions & 0 deletions reference/random/philox_engine/min.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# min
* random[meta header]
* std[meta namespace]
* philox_engine[meta class]
* function[meta id-type]
* cpp26[meta cpp]

```cpp
static constexpr result_type min();
```

## 概要
生成し得る値の最小値を取得する。


## 戻り値
最小値である`0`を返す。


## 計算量
定数時間


##
```cpp example
#include <iostream>
#include <random>

int main()
{
std::uint32_t min_value = std::philox4x32::min();
std::cout << min_value << std::endl;
}
```
* min()[color ff0000]
* std::uint32_t[link /reference/cstdint/uint32_t.md]

### 出力
```
0
```

## バージョン
### 言語
- C++26

### 処理系
- [Clang](/implementation.md#clang): 19 [mark noimpl]
- [GCC](/implementation.md#gcc): 14 [mark noimpl]
- [ICC](/implementation.md#icc): ??
- [Visual C++](/implementation.md#visual_cpp): ??
70 changes: 70 additions & 0 deletions reference/random/philox_engine/op_call.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# operator()
* random[meta header]
* std[meta namespace]
* philox_engine[meta class]
* function[meta id-type]
* cpp26[meta cpp]

```cpp
result_type operator()();
```

## 概要
乱数生成を行う。


## 効果
ランダムな値を生成し、内部状態を進める。


## 戻り値
ランダムな値を生成して返す。
値の範囲は`[`[`min()`](min.md), [`max()`](max.md)`]`である。つまり、最小値と最大値両方を含む。


## 計算量
償却定数時間


##
```cpp example
#include <iostream>
#include <random>

int main()
{
std::philox4x32 engine;

for (int i = 0; i < 10; ++i) {
// 乱数生成
std::uint32_t result = engine();
std::cout << result << std::endl;
}
}
```
* engine()[color ff0000]
* std::uint32_t[link /reference/cstdint/uint32_t.md]

### 出力例
```
3587538684
1324224816
3068087177
2030706281
1694797232
3200855668
284762628
612470539
492986243
2306264815
```

## バージョン
### 言語
- C++26

### 処理系
- [Clang](/implementation.md#clang): 19 [mark noimpl]
- [GCC](/implementation.md#gcc): 14 [mark noimpl]
- [ICC](/implementation.md#icc): ??
- [Visual C++](/implementation.md#visual_cpp): ??
Loading

0 comments on commit aa08e11

Please sign in to comment.