一様乱数,ガウス性乱数生成. このライブラリの登録時に使ったプログラム:Demo_GaussRand
Dependents: Demo_GaussRand F746_SinWithNoiseGenerator F446_FunctionGenerator
Revision 0:9a89ea736473, committed 2018-06-25
- Comitter:
- MikamiUitOpen
- Date:
- Mon Jun 25 12:54:50 2018 +0000
- Commit message:
- 1
Changed in this revision
GaussRand.hpp | Show annotated file Show diff for this revision Revisions of this file |
Random.hpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 9a89ea736473 GaussRand.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GaussRand.hpp Mon Jun 25 12:54:50 2018 +0000 @@ -0,0 +1,35 @@ +//--------------------------------------------------------- +// 線形合同法による一様乱数を使い,中心極限定理を利用する正規乱数発生 +// <文献> +// 三上直樹:「アルゴリズム教科書」,第11章,CQ出版,1996年. +// +// 2018/06/25, Copyright (c) 2018 MIKAMI, Naoki +//--------------------------------------------------------- + +#include "Random.hpp" + +namespace Mikami +{ + class GaussRand + { + public: + // sigma 標準偏差 + // av 平均値 + // x 乱数の種 + GaussRand(float sigma, float av, uint32_t x = 901253) + : sigma_(sigma), av_(av), rd_(x) {} + + // 中心極限定理を利用する正規乱数発生 + float Next() + { + float gauss = 0; + for (int n=0; n<12; n++) gauss += rd_.Next(); + return sigma_*(gauss - 6.0f) + av_; + } + + private: + float sigma_; + float av_; + Random rd_; + }; +}
diff -r 000000000000 -r 9a89ea736473 Random.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Random.hpp Mon Jun 25 12:54:50 2018 +0000 @@ -0,0 +1,34 @@ +//------------------------------------------------------------- +// 線形合同法による一様乱数発生 +// <文献> +// 三上直樹:「アルゴリズム教科書」,第11章,CQ出版,1996年. +// float 型のビット配置が IEEE の浮動小数点数と同じ場合にのみ有効 +// +// 2018/02/15, Copyright (c) 2018 MIKAMI, Naoki +//------------------------------------------------------------- + +#include "mbed.h" + +namespace Mikami +{ + class Random + { + public: + Random() : seed_(901253) {} + Random(uint32_t x) : seed_(x) {} + + // 0 以上 1 未満の一様乱数生成 + float Next() + { + seed_ = 1664525*seed_ + 1013904223; + var.usl = seed_ >> 9; // 指数部を 0 にする + var.usl |= 0x3f800000; // 指数部: 1~2 の値に対応 + return var.flt - 1.0f; + } + + private: + uint32_t seed_; // 乱数の種 + union bit32w { uint32_t usl; float flt; } var; + }; +} +