0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

自己拡張するスクリプトで円周率を計算してみた

Last updated at Posted at 2019-05-31

前提

Windows Script Hostはスクリプトファイルをロックしないらしい
自己拡張するスクリプトも可能なのでは?
折角なら円周率でも計算させたろ!

自己拡張する円周率計算スクリプトを作ってみる

コード

モンテカルロ法1で円周率を計算して、
計算結果を自身のスクリプトに書き込み
平均値を出力するスクリプトにしてみました。

pi.vbs
' *** ここから円周率の計算 ***
' 計算にはモンテカルロ法を使用
Const N = 1000000
count = 0

Randomize 
For i = 1 To N
    x = Rnd
    y = Rnd
    If x * x + y * y <= 1.0 Then
        count = count + 1
    End If
Next

pi = 4.0 * count / N

Set piList = CreateObject("System.Collections.ArrayList")
piList.add pi
' *** ここから自己拡張コード ***
' *** ここまで自己拡張コード ***

' 今まで取得したPIの平均値を取得
For Each piItem In piList
    total = total + piItem
Next

avgPi = total / piList.Count
WScript.Echo avgPi
Set piList = Nothing
' *** ここまで円周率の計算 ***

' *** ここからスクリプトを拡張するコード ***
Set fso = CreateObject("Scripting.FileSystemObject")

' スクリプト読込
Set readFile = fso.OpenTextFile(WScript.ScriptFullName, 1, False, 0) 
Set scriptList = CreateObject("System.Collections.ArrayList")

Do Until readFile.AtEndOfStream
    scriptList.add readFile.ReadLine
Loop

readFile.Close
Set readFile = Nothing

' スクリプト書込
Set writeFile = fso.OpenTextFile(WScript.ScriptFullName, 2)

For Each scriptLine In scriptList
    if scriptLine = "' *** ここまで自己拡張コード ***" Then
        ' 自己拡張コード書込
        writeFile.WriteLine "piList.add " & pi & " ' " & Now() & " に追加"
    end if

    writeFile.WriteLine scriptLine
Next

writeFile.Close
Set writeFile = Nothing

Set fso = Nothing
' *** ここまでスクリプトを拡張するコード ***

1回実行

実行結果

1回実行
>cscript pi.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

3.141336

実行後のコード

全部コードを張るとみにくいので、自己拡張された部分のみ

1回実行後のコード(自己拡張コードのみ)
' *** ここから自己拡張コード ***
piList.add 3.141336 ' 2019/05/30 20:57:10 に追加
' *** ここまで自己拡張コード ***

10回実行

実行結果

10回実行
>cscript pi.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

3.1413832

実行後のコード

10回実行後のコード(自己拡張コードのみ)
' *** ここから自己拡張コード ***
piList.add 3.141336 ' 2019/05/30 20:57:10 に追加
piList.add 3.14266 ' 2019/05/30 20:59:10 に追加
piList.add 3.139868 ' 2019/05/30 20:59:12 に追加
piList.add 3.141932 ' 2019/05/30 20:59:13 に追加
piList.add 3.14216 ' 2019/05/30 20:59:14 に追加
piList.add 3.1392 ' 2019/05/30 20:59:16 に追加
piList.add 3.139744 ' 2019/05/30 20:59:17 に追加
piList.add 3.14188 ' 2019/05/30 20:59:19 に追加
piList.add 3.141728 ' 2019/05/30 20:59:20 に追加
piList.add 3.143324 ' 2019/05/30 20:59:21 に追加
' *** ここまで自己拡張コード ***

せっかくなので1000回実行

流石に実行結果のみで

実行結果

1000回実行
>cscript pi.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

3.14167134

んーイマイチ

ここまできたら10000回実行

1000回の結果がイマイチだったので…

実行結果

10000回実行
>cscript pi.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

3.1415769512

まぁ、こんなもんですかね

感想

円周率の計算は正直オマケで、
Windows Script Hostがスクリプトファイルをロックしていない事実確認が出来て良かったです!

  1. 乱数をつかって試行を繰り返し、近似解を求める手法。詳しくはググって!

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?