【问题标题】:How to improve this function to test Underscore Sample `_.sample()`如何改进此功能以测试下划线示例`_.sample()`
【发布时间】:2016-06-17 17:19:46
【问题描述】:

设置:

我第一次在一些客户的代码中使用_.sample(),我想测试它以确保它一次又一次地产生均匀分布的样本。

为了测试这一点,我创建了以下代码:

(function(arraySize, timesToRun){
  arraySize = arraySize || 10;
  timesToRun = timesToRun || 1000;
  let myArray = Array.apply(null, {length: arraySize}).map(Number.call, Number);
  let resultsArray = Array.apply(null, Array(arraySize)).map(Number.prototype.valueOf,0);
  for (let i = 0; i < timesToRun; i++) {
    var result = _.sample(myArray);
    resultsArray[result]++;
  }
  return resultsArray;
})(10, 1000);

这在我的 Chrome 浏览器中完美运行,得到以下结果:

[93, 112, 97, 87, 97, 107, 97, 104, 105, 101]

正如预期的那样,使用其他输入 (20, 10000) 我们得到:

[646, 663, 641, 749, 648, 686, 642, 631, 663, 688, 691, 639, 672, 663, 678]

所以...就是这样,代码可以满足我的需要,完全可以接受。


这是我要找的:

以下说明:

如果回答可以回答这三个问题中的任何一个/所有问题,则将被接受。

  1. 我不明白Array.apply(null, {length: arraySize}).map(Number.call, Number); 是如何工作的。具体来说,让我非常困惑的部分是map 调用中发生的事情:map(Number.call, Number) - 为什么这会产生一个看起来像[0,1,2,3,4,5,6,7,8,9] 的数组?看到这个问题被分成不同的问题,我问了这个具体问题elsewhere
  2. 为什么我们在map(Number.prototype.valueOf,0) 中需要Number.prototype.valueOf 我把这个问题放到了一个新帖子this has been answered here
  3. 有没有更好的方法将默认值设置为arraySizetimesToRun(注意:我在函数调用中放入相同的值只是为了说服 - 我知道这不是必需的。)

请对代码提出任何其他批评,我问这个问题是为了了解更多关于 Javascript 的信息,看看是否有任何明显的改进可以对这个函数进行。


愿望清单:

如果他们知道这样做的好方法,也许任何人都可以发表评论:

我想找到一种简洁的方法来为这个测试创建图形输出。有谁知道一个易于使用的库,以便我可以绘制它。也许更多的输入我们可以得到一个漂亮的钟形曲线? - Here is a simple way - 我把它放在这里是因为这个问题再一次被否决了,但我想为其他想要这样做的人提供信息。


重要提示!

此问题的格式不正确。我会将这个问题分解成更小的问题,并分别发布。我在阅读后进行了此编辑:https://blog.stackoverflow.com/2010/09/good-subjective-bad-subjective/

...好吧,我无法结束这个问题 - 所以我将把原来的帖子留在下面。如果有人决定回答这个问题,我仍在寻找这些问题的答案,我会接受。

【问题讨论】:

  • @robertklep 是的,我创建了代码。我从this SO question 找到的代码非常有用,并且像最好的方法一样接缝。但我不明白(Number.Call, Number) 实际上是如何做的。我了解它做什么,但我不明白为什么,或如何它做到这一点。我认为在 StackOverflow 上提问是可以的——这就是我来到这里的原因,以了解为什么会这样工作。我通过其他方式找不到答案
  • @MikeMcCaughan 我确实做了自己的研究。我不拘泥于任何事情——我只是想从 StackOverflow 的人那里寻找更深入的解释。我看到人们一直在推荐库和实现目标的方法,我认为专门提出这个要求是合适的。此外,其他人可以从提供的答案中学习。你会建议一个更好的方法来问这个问题吗?也许将其分解为几个较小的问题?根据您的个人资料,您是#SOreadytohelp - 请添加建设性的 cmets
  • 您是否阅读了我在评论中添加的链接?前者详述了许多改进问题的方法,后者详述了图书馆推荐问题为何离题。
  • @MikeMcCaughan help center 将我指向Good Subjective Bad Subjective 阅读该页面后,我想我明白你的意思了。我会删除我的问题。

标签: javascript arrays underscore.js random-sample


【解决方案1】:

由于抱怨这个问题不是很直接,我创建了其他帖子来获得我正在寻找的答案。这回答了我的主要问题。

答案:

  1. 了解array.prototype.call() 的工作原理解释了此模式的输出。可以在这里找到完整的详细答案:Mapping Array in Javascript with sequential numbers
  2. 原因在于array.prototype.map() 的工作方式 - 完整答案在这里:Why do we use Number.prototype.valueOf inside of a map() function
  3. 是的,从 ES6 开始,有另一种方法可以在 javascript 中为参数设置默认值:

(function(arraySize = 10, timesToRun = 1000){
  let myArray = Array.apply(null, {length: arraySize}).map(Number.call, Number);
  let resultsArray = Array.apply(null, Array(arraySize)).map(Number.prototype.valueOf,0);
  for (let i = 0; i < timesToRun; i++) {
    var result = _.sample(myArray);
    resultsArray[result]++;
  }
  // Turned into console.log() for StackOverflow Snippet
  // return resultsArray;
  console.log(resultsArray);
})();
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"&gt;&lt;/script&gt;

如果有人感兴趣,还有here is a simple way to set this up graphically

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2021-12-16
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多