前提
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がスクリプトファイルをロックしていない事実確認が出来て良かったです!
-
乱数をつかって試行を繰り返し、近似解を求める手法。詳しくはググって! ↩