一様乱数,ガウス性乱数生成. このライブラリの登録時に使ったプログラム:Demo_GaussRand

Dependents:   Demo_GaussRand F746_SinWithNoiseGenerator F446_FunctionGenerator

Files at this revision

API Documentation at this revision

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;
+    };    
+}
+