35
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Zabbixで円周率の近似値を求めてみた

Last updated at Posted at 2025-12-10

こんにちは。はじめてQiitaでZabbixの記事を投稿します。
アドベントカレンダー14日に投稿予定でしたが、本日10日の投稿者がいなさそうだったので、前倒しで投稿しています。

今回は、Zabbixで円周率を求めてみたくなった(?)ので、やってみました。

1.円周率とは?

円周率とは、円の直径に対する円周の長さの比率のことです。
記号でπと表します。数値で見ると3.1415...と無限に続くことが知られています。

2.円周率の求め方

円周率の求め方はいろいろありますが、代表的な手法にモンテカルロ法があります。

まず、半径1の円を考えます。
半径1の円

次に、四辺がその円に内接する正方形を考えます。
1辺が2の正方形

この時、円の面積は、「半径×半径×円周率」の公式よりπ、正方形の面積は、「一辺×一辺」の公式より4になり、正方形に対する円の面積比率は4:πであることがわかります。

さて、ここで、正方形の中(正方形の辺上も含むものとする)に、ランダムな打点をすることを考えます。
点は、円の内部(円周上も含むものとする)に入っているか、円の外部に出ているかの2通りです。
打点イメージ

打点をn回繰り返した時、円の内部の点がm個であったとすると、
点の総数に対する円の内部の点の割合はn:mになります。
この比率は、正方形に対する円の面積比率に近似でき、4:π≒n:m、すなわちm/n≒π/4となるため、
πは4×m/nで近似できることになります。

この試行を回数を増やすことで、精度高くπの近似値が求められます。

3.やりたいこと

モンテカルロ法の手法において、乱数によってランダムな打点を1回行い、円の内部であれば1、円の外部であれば0を返すスクリプトを組みます。
そのスクリプトを実行し続け、値の平均値をとれば、それがπ/4の近似値になります。
このスクリプトの返り値をZabbixで収集すれば、データの平均値が円周率になるのでは!?というのが今回の主張です。

4.やってみた

まずは打点するスクリプトを書きます。

/etc/zabbix/script/mo_pi.sh
#!/bin/bash
# 正方形 [-1,1] x [-1,1] 内にランダムに点を打ち、
# 点が単位円 (x^2 + y^2 <= 1) の内側なら "1"、外なら "0" を出力する。

# awk を使って乱数を作り判定する
awk 'BEGIN{
# 乱数を初期化する
  srand()

# -1~1の値を2つ取る
  x = rand()*2 - 1
  y = rand()*2 - 1

# 円の中にあるか判断する
  if (x*x + y*y <= 1) {
    print 1
  } else {
    print 0
  }
}'

何回か実行してみましょう。

実行結果
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
0
[root@localhost script]# ./mo_pi.sh
0
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
1

なんとなく3/4くらいの確率で1を返してそうな気がします。

このスクリプトの返り値をZabbixで収集したいので、User parameterを設定します。(ようやくZabbixが出てきた…)

/etc/zabbix/zabbix_agent2.conf
UserParameter=mo_pi,/etc/zabbix/script/mo_pi.sh

Webコンソールで、アイテムを設定します。

打点実行アイテム

打点

膨大な回数試行したいので、監視間隔は1sとしときます。

平均値の4倍をとるアイテム

近似値

こちらは1m間隔にしておきます

では、しばらく放置して、データがある程度集まったところで近似値を見てみます。

5分打点(300回打点)の精度

5分打点の精度

30分打点(1,800回打点)の精度

30分打点の程度

1時間打点(3,600回打点)の精度

1時間打点の精度

あまり精度が高くないです。。。
ホストPCに頑張ってもらい、1日放置してみます。

24時間打点(86,400回打点)の精度

24時間打点の精度

だいぶ精度があがってきました。

5.落としどころ

さて、どうやってオチをつけようか悩んでいましたが、なんとZabbixには円周率が定数関数として定義されています

円周率定数関数

この定数と小数点第5位まで一致(誤差約0.00008%未満)になったらメールを飛ばして終わりにしましょう。

誤差計算アイテム

誤差
定数関数と計算した近似値の差の絶対値をとります。

トリガー条件式

誤差判定トリガー

数日間待ってみましたが、思ったように精度が上がらず・・・。打点アイテムの数を増やして、スピードアップしたりしました。

/etc/zabbix/zabbix_agent2.conf
UserParameter=mo_pi,/etc/zabbix/script/mo_pi.sh
UserParameter=mo_pi1,/etc/zabbix/script/mo_pi1.sh
UserParameter=mo_pi2,/etc/zabbix/script/mo_pi2.sh
UserParameter=mo_pi3,/etc/zabbix/script/mo_pi3.sh
UserParameter=mo_pi4,/etc/zabbix/script/mo_pi4.sh
UserParameter=mo_pi5,/etc/zabbix/script/mo_pi5.sh
UserParameter=mo_pi6,/etc/zabbix/script/mo_pi6.sh
UserParameter=mo_pi7,/etc/zabbix/script/mo_pi7.sh
UserParameter=mo_pi8,/etc/zabbix/script/mo_pi8.sh
UserParameter=mo_pi9,/etc/zabbix/script/mo_pi9.sh
UserParameter=mo_pi10,/etc/zabbix/script/mo_pi10.sh

カスタマイズ

メールが来ました。
メール

最終的なグラフです。だいぶ3.1415...周辺に落ち着いています。
最終グラフ

6.まとめ

やってみた感想です。

  • Zabbixではグラフが描画されるので、徐々に精度が上がっていく過程を見るのが楽しかった
  • 円周率のほかにも、Zabbixを使っていろいろな近似値を求めたり、数学的なグラフを書いてみるのも面白そう

最後まで読んでいただき、ありがとうございました。

35
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?