邪道な答え方を王道から遠ざける

大人買いコンプリート確率を求めるプログラムをrandom使わないで超高速にもうちょっと賢い感じに。(どんどん磯崎さんの話題から離れていく)

c0041583_18115145.gif
状態モデルとしてはこんな感じ。3個揃ってる状態のとき、次の1個を買って4個揃ってる状態になる確率は7/10。逆に次の1個を買っても3個揃ってる状態のままである確率は3/10。

確率って、1回1回さいころ振ってシミュレーションしてもいいけど、この問題みたいにシンプルなモデルの場合は、「0.1%の確率ってのは、100個中0.1個が《ソッチに行く》ってことだ」と考えて、100個のモノを経路に流すようなイメージで考えてもいい。そうすれば10000回以上分の試行が1回の計算でできたことになる。

そんなわけで作り直したプログラム。randomとか繰り返し試行を使わないから超高速。一瞬の実行でまともにきれいなグラフができました。66個目で99%超えたよ。
c0041583_18184795.gif





var STATE_LENGTH = 10;
var END_PERCENTAGE = 99;
var MAX_PARCHASE = 80;

function main() {
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var fout = fs.OpenTextFile("result.csv", 2, true); // ファイル出力の準備

var states = new Array(STATE_LENGTH + 1); // 「0個揃った状態」~「10個揃った状態」
states.fill(0);
states[0] = 100; // 100回分のn個の大人買い試行をやったときのstates[10]の値=成功確率%

var flag = false;
for (var n = 0; n < MAX_PARCHASE; n++) {
fout.Write(states.join(","));
if (states[STATE_LENGTH] > END_PERCENTAGE && !flag) {
WScript.Echo("大人買い" + n + "個目でコンプリート成功率"
+ END_PERCENTAGE + "%を超えました");
flag = true;
}
fout.Write("\n");
for (var i = STATE_LENGTH - 1; i >= 0; i--) {
// i個揃った状態からi+1個揃った状態になる確率は(10-i)/10。
var move = states[i] * (STATE_LENGTH - i) / (STATE_LENGTH);
states[i] -= move;
states[i + 1] += move;
}
}
fout.Close();
}

Array.prototype.fill = function(obj) {
for (var i = 0; i < this.length; i++) {
this[i] = obj;
}
}

main();

[PR]
by tockri | 2005-11-25 18:20 | └ 問題集
移転しました。
by tockri
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
最新のトラックバック
[media][gove..
from bewaad institu..
甘やかされた男たち
from とっくりばー
~が下手
from たのしい検索・ゆかいな検索
例えバトン
from ひまわりてんびんへの道
例えバトン
from 明日は明日のホラを吹く-To..
リンク
ライセンス

クリエイティブ・コモンズ・ライセンス

このブログのテキストおよび画像は、クリエイティブ・コモンズ・ライセンスの下でライセンスされています。




検索
ファン
ブログジャンル
画像一覧