Java

円周率をモンテカルロ法で求める

Java

モンテカルロ法という乱数シュミレーションで円周率を導き出してみます。

半径 r の円の面積は PI * r^2 ですよね。

半径 r を 1 とした円を中心から十文字に四等分した右上の部分を使って円周率を求めます。

円の中心から辺の長さ 1 の正方形を重ねます。

正方形の中には4等分された右上の部分の扇形の円がきっちり半径 1 の状態であります。

この時 x 軸、y 軸の 1 の位置は重ねた正方形の辺の長さ 1 になりますね。

よって、正方形の面積 : 扇の面積 = 1 : PI / 4 となります。

したがって PI を求める式は次のようになります。

PI = 4 * 扇の面積/正方形の面積

プログラムは乱数を使ってこの正方形の中にたくさんの針を落とします。

針の落ちた位置が扇の中か外かで円周率を求めていくという力技の方法です。

落とす針の数が多いほど精度は上がる理屈ですが処理時間も増えてしまいます。

とりあえず試してみましょう。 

 

jp\yucchi\montecarlo_pi\Montecarlo_PI.java

実行結果は次のようになりました。

run:
Mathクラスによる円周率は 3.141592653589793
モンテカルロ法による円周率は 3.14185944
構築成功 (合計時間: 9 秒)

何回かやって見たのですが小数点以下3位くらいまでの精度しかでませんでした。

精度を上げるにはこの処理を数回(数万回?)繰り返して平均をとればいいのかなぁ・・・?

Hatena タグ:

はじめての Lambda vol.5

Java

Lambda のことをいろいろ軽く調べてきました。

Swing を使った GUI アプリでも Lambda は重宝されそうですね。

それでは Lambda を使った簡単な Swing アプリを作ってみました。

jp\yucchi\Swing_Lambda_1.java

これまでのコードと違う部分が2カ所ありますね。

Lambda を使うと無名クラスの生成記述を省略できてしまうんですね~(^_-)-☆

それでは本当にこれで動くのか確認してみます。

おおっ!動いてますね(^_^)v

Lambda を使った難しいことは解りませんがこんな簡単で便利なことは好きです!

少しずつ Lambda に慣れて JDK 8 を楽しめるようになれるといいなと思う今日この頃です。

Hatena タグ:


はじめての Lambda vol.4

Java

はじめての Lambda シリーズも4回目となりました。

今回は Method Reference を使ってみることにします。

Method Reference って名前のとおりメソッド参照です。

メソッドに対する参照だけです。

よって、はじめての Lambda vol.2 でのサンプルコードの最大値を求める部分を

Method Reference に置き換えることができます。

下記コードのように非常に簡潔になります。(^_^)v

jp\yucchi\hello_lambda_2\Hello_Lambda_2.java

Math::max の部分が Method Reference を利用したコードです。

こんなにすっきりしたコードで本当にちゃんと動くのか?

試してみました。

Method Reference

 

おおっ! ちゃんと動いてるじゃないか!

一時期、Method Reference に :: # どちらを使うかで熱い議論がなされていた。(今も?)

Java™ Platform, Standard Edition 8 Developer Preview with Lambda Support b 39 では

:: (ダブルコロン)が採用されているようです。

Java 8 で Lambda が実装されたら馴染みのない素敵なコードを見ることができるような気がします。

Hatena タグ:

はじめての Lambda vol.3

Java

JDK 8 で採用される予定の Lambda についていろいろ調べているんですが

今回は Virtual Extension Methods または Defender Methods と言われている?

新たな(都合の良い?)ものについて調べてみました。

インタフェースを実装する場合 JDK 7 までは全てのメソッドを実装する必要でしたよね。

JDK 8 ではデフォルト実装を定義できるらしいんです。

具体的には次のプログラムを見てください。

jp\yucchi\virtual_extension_method_1\Virtual_Extension_Method_1.java

今までだったら sayHelloDefalter() メソッドを HelloImplementer クラスが実装していないので

コンパイルエラーになったはずですよね。

JDK 8 ではメソッドに defalt キーワードを付けることによって

デフォルト実装されます!

実際に動かしてみました。

Virtual Extension Methods 1

ちゃんと動いてます。

もちろん、デフォルト実装されたメソッドも!

ここでちょっと疑問が・・・

デフォルト実装されたメソッドってオーラーライドできるの?

コードを次のように変更しました。

 

jp\yucchi\virtual_extension_method_1\Virtual_Extension_Method_1.java

 

それでは実行させてみます。

Virtual Extension Methods 2

ちゃんとオーバーライドされてますね!(^^)

なかなか面白いですね。

この Virtual Extension Methods は Lambda を実装するのにおまけではなく

必要不可欠な実装らしいです。

私は Lambda のことはまだほとんど解りませんが JDK 8 がリリースされるのが少し楽しみになってきました。(*^_^*)

Hatena タグ:

はじめての Lambda vol.2

Java

今朝から作ったプログラムを Lambda を使うように変更しようといろいろ調べてた。

そしたら以前 Fork/Join フレームワークについて調べていたときに発見したコードを目にした。

確か IBM のサイトにあった記事だがどうやらちょくちょくサンプルにあがってくるコードらしい。

日本語で Lambda の解説をしてくれているサイトにもあった。

ある年の学生のハイスコアを見つけ出すプログラムだ。

それを参考にしてこんなプログラムを組んでみた。

一番大きなバストを調べるプログラムだ。

ただし年齢制限を設けた。

16歳以上、26歳未満だ。

Java 7 でのコードは次のようになります。

jp\yucchi\hello_lambda_2\Hello_Lambda_2.java

実行結果は

run:
16歳以上、26歳未満で一番大きな胸のサイズは90です。
構築成功 (合計時間: 0 秒)

期待通りの結果となります。

次にこれを Lambda を使ってみます。

 

jp\yucchi\hello_lambda_2\Hello_Lambda_2.java

なんか見慣れないものがちらほらありますね。

実行結果は

Hello_Lambda_2

Good! (^^)

この部分が JDK 8 の新兵器 Lambda ですね。

見慣れないメソッドの正体は

filter メソッド : コレクションの要素のフィルタリングをする優れものです。

引数の Predicate オブジェクトの eval メソッドの戻り値が true の要素だけをフィルタリングします。

 

map メソッド : 新しいコレクションを作り直すメソッドです。

Mapper オブジェクトの map メソッドの戻り値を新たな要素としたコレクションを作ります。

 

reduce メソッド : 要素を減らして、最終的に一つにするためのメソッドです。

以上のように Lambda を使うポイントを少しだけ知ったつもりになった。(^0^;)

もっと詳しく知りたい方は参考にさせていただいたというよりは、まるっといただいたサイトを紹介します。

Project Lambda

こちらのサイトが勉強になります。

ただし、上記のプログラムでパラレル処理をする方法も載っていましたが

なんと エラー になってしまいます。

Lambda はまだ開発途中なので紹介したサイトの情報もいつまで有効なのかは解りません。

日本語の情報はまだまだ少ないようなので、英語が得意な方は英語サイトをググって情報収集したほうがいいかもです。

Hatena タグ:

« 古い記事 新しい記事 »