「XorShift」の版間の差分

提供:APCC
ナビゲーションに移動 検索に移動
(ページの作成:「'''XorShift'''(えっくすおあしふと)とは乱数生成アルゴリズムの1つである。 ==内容== いきなりだが、コードを書く。 <pre> uint32_t xo…」)
 
(加筆)
 
10行目: 10行目:
</pre>
</pre>
Cを知らない人のために説明すると、
Cを知らない人のために説明すると、
①値と(値を2の13乗倍)のXORを計算する
# 値と(値を2の13乗倍)のXORを計算する
②①で計算した値と(①で計算した値を2の17乗で割ったもの)のXORを計算する
# 1. で計算した値と(1. で計算した値を2の17乗で割ったもの)のXORを計算する
③②で計算した値と(②で計算した値の2の5乗倍)のXORを計算する
# 2. で計算した値と(2. で計算した値の2の5乗倍)のXORを計算する
というアルゴリズムである。シード値を設定したい場合はxに大きめの適当な数を入れておく。
というアルゴリズムである。シード値を設定したい場合はxに大きめの適当な数を入れておく。
==特徴==
==特徴==
XorもShiftも一瞬で計算できるので、とても速い。またそれなりに性質の良い乱数が生成できる。
*XorもShiftも一瞬で計算できるので、とても速い。
またメモリを消費しない。このため非常にゲームに向いている。<ref>平山 尚、ゲームプログラマになる前に覚えておきたい技術 p773</ref>
*それなりに性質の良い乱数が生成できることが知られている。
*メモリの消費量が非常に小さい。
*上記の5行と実装も非常に小さい
 
といった理由で、非常にゲームに向いている。<ref>平山 尚、ゲームプログラマになる前に覚えておきたい技術 p773</ref>
メルセンヌ・ツイスタと比べて乱数の品質は少し落ちるが、メルセンヌ・ツイスタと比べてこちらは格段に高速である。
==関連項目==
==関連項目==
*[[乱数]]
*[[乱数]]

2022年1月5日 (水) 22:42時点における最新版

XorShift(えっくすおあしふと)とは乱数生成アルゴリズムの1つである。

内容

いきなりだが、コードを書く。

uint32_t xor(void) {
  static uint32_t y = 2463534242;
  y = y ^ (y << 13); y = y ^ (y >> 17);
  return y = y ^ (y << 5);
}

Cを知らない人のために説明すると、

  1. 値と(値を2の13乗倍)のXORを計算する
  2. 1. で計算した値と(1. で計算した値を2の17乗で割ったもの)のXORを計算する
  3. 2. で計算した値と(2. で計算した値の2の5乗倍)のXORを計算する

というアルゴリズムである。シード値を設定したい場合はxに大きめの適当な数を入れておく。

特徴

  • XorもShiftも一瞬で計算できるので、とても速い。
  • それなりに性質の良い乱数が生成できることが知られている。
  • メモリの消費量が非常に小さい。
  • 上記の5行と実装も非常に小さい

といった理由で、非常にゲームに向いている。[1] メルセンヌ・ツイスタと比べて乱数の品質は少し落ちるが、メルセンヌ・ツイスタと比べてこちらは格段に高速である。

関連項目

  1. 平山 尚、ゲームプログラマになる前に覚えておきたい技術 p773