什么是计算独立事件概率的 Google Apps 脚本?
What is a Google Apps Script to Calculate the Probability of Independent Events?
我正在尝试创建一个脚本来计算在 20 场比赛的赛季中 0-20 胜的概率,结果在 spreadsheet 的 F 列中。
找出 0 和 20 获胜的概率简单快捷,因为只有一种方法可以实现。计算 1:19 获胜的概率很简单,但需要更长的时间,因为有 1,048,576(2^20-2) 种不同的游戏方式。这个问题有一个很棒的 VBA/Excel 解决方案 here,但我想使用 GAS。
这是我的 GAS 尝试:
function multiplyArrays2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sht = ss.getSheetByName("ProbWin");
var probs = sht.getRange("B3:C22").getValues();
for (var i = 0; i < 2^20-1; i++) { //2^20=total combinations
var ctr = 0; //I deleted the duplicate of this exact line below var wk and VBA ran
var wk = 1; //Added "var" for GAS
for (var j; i < 20; i++) {
if ix[j] = 1 { //this is the first line GAS underlines red. I don't know how to deal with the "x"
wk = wk * probs[j, 1] //changed () to [] to deal with array
ctr = ctr + 1
} else {
wk = wk * probs[j, 2]
}
}
var outprobs[ctr, 1] = outprobs[ctr, 1] + wk; //added "var"
for (var j; i < 20; i++) {
ix[j] = ix[j] + 1 //again, I don't know how to deal with the "x"
if ix[j] = 1 {
ix[j] = 0
}
}
}
sht.getRange("F2:F22").setValues(outprobs);
};
非常感谢任何帮助。
你的情况,下面的修改怎么样?
修改后的脚本:
function multiplyArrays2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sht = ss.getSheetByName("ProbWin");
var probs = sht.getRange("B3:C22").getValues();
var ix = Array(20).fill(0);
var outprobs = [...Array(21)].map(_ => [0]);
for (var i = 0; i <= Math.pow(2, 20) - 1; i++) {
var ctr = 0;
var wk = 1;
for (var j = 0; j < 20; j++) {
if (ix[j] == 1) {
wk *= probs[j][0];
ctr++;
} else {
wk *= probs[j][1];
}
}
outprobs[ctr][0] += wk;
for (var j = 0; j < 20; j++) {
ix[j]++;
if (ix[j] == 1) break;
ix[j] = 0;
}
}
sht.getRange("F2:F22").setValues(outprobs);
}
结果:
当此脚本为您的示例 Spread运行sheet 时,将获得以下结果。
注:
- 当我看到你的样本 Spreadsheet 时,sheet 的名字是
ProbWin
。请注意这一点。
- 此修改后的脚本适用于您的示例 Spreadsheet。所以当你改了Spreadsheet,这个脚本可能就不能用了。请注意这一点。
我正在尝试创建一个脚本来计算在 20 场比赛的赛季中 0-20 胜的概率,结果在 spreadsheet 的 F 列中。
找出 0 和 20 获胜的概率简单快捷,因为只有一种方法可以实现。计算 1:19 获胜的概率很简单,但需要更长的时间,因为有 1,048,576(2^20-2) 种不同的游戏方式。这个问题有一个很棒的 VBA/Excel 解决方案 here,但我想使用 GAS。
这是我的 GAS 尝试:
function multiplyArrays2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sht = ss.getSheetByName("ProbWin");
var probs = sht.getRange("B3:C22").getValues();
for (var i = 0; i < 2^20-1; i++) { //2^20=total combinations
var ctr = 0; //I deleted the duplicate of this exact line below var wk and VBA ran
var wk = 1; //Added "var" for GAS
for (var j; i < 20; i++) {
if ix[j] = 1 { //this is the first line GAS underlines red. I don't know how to deal with the "x"
wk = wk * probs[j, 1] //changed () to [] to deal with array
ctr = ctr + 1
} else {
wk = wk * probs[j, 2]
}
}
var outprobs[ctr, 1] = outprobs[ctr, 1] + wk; //added "var"
for (var j; i < 20; i++) {
ix[j] = ix[j] + 1 //again, I don't know how to deal with the "x"
if ix[j] = 1 {
ix[j] = 0
}
}
}
sht.getRange("F2:F22").setValues(outprobs);
};
非常感谢任何帮助。
你的情况,下面的修改怎么样?
修改后的脚本:
function multiplyArrays2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sht = ss.getSheetByName("ProbWin");
var probs = sht.getRange("B3:C22").getValues();
var ix = Array(20).fill(0);
var outprobs = [...Array(21)].map(_ => [0]);
for (var i = 0; i <= Math.pow(2, 20) - 1; i++) {
var ctr = 0;
var wk = 1;
for (var j = 0; j < 20; j++) {
if (ix[j] == 1) {
wk *= probs[j][0];
ctr++;
} else {
wk *= probs[j][1];
}
}
outprobs[ctr][0] += wk;
for (var j = 0; j < 20; j++) {
ix[j]++;
if (ix[j] == 1) break;
ix[j] = 0;
}
}
sht.getRange("F2:F22").setValues(outprobs);
}
结果:
当此脚本为您的示例 Spread运行sheet 时,将获得以下结果。
注:
- 当我看到你的样本 Spreadsheet 时,sheet 的名字是
ProbWin
。请注意这一点。 - 此修改后的脚本适用于您的示例 Spreadsheet。所以当你改了Spreadsheet,这个脚本可能就不能用了。请注意这一点。