我有一些奇怪的错误,我无法理解它的来源。我是在Google Script环境中用js编写的。
function tester() {
var pdf = [[0,5],[1,5],[2,40],[3,50]]; // some pdf as a 2d array
var tuple = [0,0,0,0]; //the resulting pdf from the test
var rand = 0;
for (var i = 0; i<100; i++){ //100 times initialize a random variable and then catch the result into the tuple
rand = getRandomN(pdf);
if (rand==0){tuple[0]+=1} //if the outcome==0 then add 1 to the first element of the tuple
else if (rand==1){tuple[1]+=1}
else if (rand==2){tuple[2]+=1}
else if (rand==3){tuple[3]+=1}
}
Logger.log(tuple);
}
getRandomN(pdf)
根据pdf
问题是元组总是在某些地方返回1的所有零。看起来随机函数的工作正常,但循环只经过一次。 有人有提示吗?
更新:
function getRandomN(pdf) {
var result = 0;
var rand = getRandomInt(0,10000)/100;
for (var i=1; i<pdf.length; i++){
pdf[i][1] = pdf[i][1] + pdf[i-1][1];
}
if (pdf[pdf.length-1][1] != 100){return undefined}
//Logger.log(rand);
for (var i=0; i<pdf.length; i++){
if (rand<=pdf[i][1]){result=pdf[i][0]; break}
}
Logger.log(pdf);
return result;
}
来自Mozilla的标准功能
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
答案 0 :(得分:1)
原因是:
if (pdf[pdf.length-1][1] != 100){return undefined;}
如果您return 0 or any of rand first index
,那么您将返回undefined,然后它将显示正确的tuple
,您可以看到循环计数。
尝试运行:
function tester() {
var pdf = [[0,5],[1,5],[2,40],[3,50]]; // some pdf as a 2d array
var tuple = [0,0,0,0]; //the resulting pdf from the test
var rand = 0;
for (var i = 0; i<100; i++){ //100 times initialize a random variable and then catch the result into the tuple
rand = getRandomN(pdf);
tuple[rand] += 1;
}
console.log(tuple);
document.write(tuple);
}
function getRandomN(pdf) {
var result = 0;
var rand = getRandomInt(0,10000)/100;
// console.log(rand);
for (var i=1; i<pdf.length; i++){
pdf[i][1] = pdf[i][1] + pdf[i-1][1];
}
if (pdf[pdf.length-1][1] != 100){return 0;}//return any of 0,1,2,3 to test your code.
for (var i=0; i<pdf.length; i++){
if (rand<=pdf[i][1]){result=pdf[i][0]; break}
}
// console.log(pdf);
return result;
}
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
tester();
答案 1 :(得分:0)
我想我知道为什么。因为pdf的范围在tester()
内是完全全局的,并且我在getRandomN(pdf)
内更改它,因此,它一直在增加,并且在第一次运行之后它会更新并且我已经在计算从一个新的pdf,其中pdf的最后一个元素(即cdf)永远不会等于100。
更新:
只是如果您对正确的代码感兴趣。将pdf映射到cdf的部分并不是最美丽的部分。我很欣赏改进提示,但它运作得很好。感谢贡献者指出正确的方向。
function getRandomN(pdf) {
var result = 0;
var rand = getRandomInt(0,10000)/100;
var cdf = [];
//construct the cdf
for (var i=1; i<pdf.length; i++){
//handle the first unchanged element
cdf[0]=[];
cdf[0][1] = pdf[0][1];
cdf[0][0] = pdf[0][0];
cdf[i]=[];
cdf[i][1] = pdf[i][1] + cdf[i-1][1];
cdf[i][0] = pdf[i][0];//add all outcomes to the array's first column
}
if (cdf[cdf.length-1][1] != 100){return undefined}
//Logger.log(rand);
for (var i=0; i<cdf.length; i++){
if (rand<=cdf[i][1]){result=cdf[i][0]; break}
}
//Logger.log(cdf);
return result;
}