一様乱数,ガウス性乱数生成. このライブラリの登録時に使ったプログラム: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
--- /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_;
+    };    
+}
--- /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;
+    };    
+}
+