在javascript中从pdf中挑选一个随机变量

时间:2015-01-15 15:09:27

标签: javascript for-loop

我有一些奇怪的错误,我无法理解它的来源。我是在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;
}

2 个答案:

答案 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;
}