鳳鳴は祖父の俳号

日記 メモ そんなの

Luaでちょっと遊ぶ モンテカルロ法

 Luaが面白そうだったので書いてみる。Pascalじゃないですかこれ。関数内で関数も定義できるみたいだし。

良いもの。悪いもの。: Lua基礎文法最速マスター
Lua 5.1 リファレンスマニュアル

 半径1の球の体積を求めてみる。半径1の球がぴったり入る立方体は2×2×2=8、この中に一様に分布するランダムな点を打ち、球の中√(x^2+y^2+z^2)に入る点を数える。この点の数は立方体の中全体の点とくらべて 4/3×π:8になるはず。

モンテカルロ法 - Wikipedia

 Luaで実行するときはそのまま引数にLuaスクリプトを書いたファイルの名前を渡してOK。
関数は使われる前に宣言する。
awkであるような暗黙のうちの0代入はない。sum=sum+1とするとき右辺のsumがnilと言われた。

これ実行するとしばらく待って以下の表示。でも八千万回も回してなんてBASICの頃は考えられんかったねー

$ lua kyuu.lua
80000000 41884467

-- 20130110
--
-- 立方体(2r)*(2r)*(2r)=8r^3
-- 球 4/3*pi*r^3
-- 4/3*pi = 4.1887902

math.randomseed(2013) -- 適当

sum=0
it=80000000

function kyuu(x,y,z)
	local v=math.sqrt(x*x + y*y + z*z)
	return v
end

--

for i=1,it do
	x,y,z=math.random(),math.random(),math.random()
	if kyuu(x,y,z)<1 then
		sum = sum+1
	end
end

print(it,sum)