从阵列中随机拉出的最佳方法?

时间:2015-03-27 18:36:14

标签: javascript random

当你点击一个大红色按钮时,我有一个网站会给你一个随机的事实。我听到一些人说他们反复得到某些事实,即使有200多人。

大红色按钮有onclick="giveafact()",触发此功能:

function giveafact(){ //instead of relisting all array items here, add all the other arrays to this one
  var factsList= foodFactsList.concat(musicFactsList,historyFactsList,popFactsList,sportsFactsList,technologyFactsList,televisionFactsList,miscFactsList);
  randomFact = Math.floor(Math.random()*factsList.length);
  document.getElementById("total").innerHTML=factsList.length;
  document.getElementById("fact").innerHTML=factsList[randomFact];
  updateShareLinks();
  return false;
}

基本上,我在上面var factsList中可以看到8个不同的事实数组。这样用户就可以按事实过滤。默认情况下,没有过滤器,因此所有列表都连接在一起。

如果有帮助,则完整的.js文件位于:http://thewikifix.com/scripts/script.js。这些随机的“给出事实”函数从大约442行开始,其中的数组高于它们。 (原谅凌乱的代码,我知道我经常混合使用jQuery和Javascript。)

该网站为http://thewikifix.com,如果它可以帮助任何人查看所有代码。

我只是想看看是否有办法比现在更好地随机化事实,可能是通过添加一个不允许事实连续出现两次的功能,或类似的东西。

任何建议都会很棒!

编辑 - 其他想法:感谢目前为止的答案。有没有办法从数组中删除一个项目,一旦它通过Math.random函数被选中,所以它根本不会再显示(除非页面被刷新)?如果是这样,一旦从阵列中删除所有项目,有没有办法将阵列重置为其原始状态,而无需用户刷新?感谢。

2 个答案:

答案 0 :(得分:0)

“随机”和“变化”在某种程度上是相互矛盾的。有200个事实,每次随机选择一个事实,你很可能会在只有十几个事件之后看到重复(这被称为“生日问题”)。

一种简单的方法是在客户端上存储种子和索引。种子设置一次,并且在每次事实访问后递增索引。要获得“随机”事实,请使用种子播种PRNG,使用PRNG对事实列表进行洗牌,然后在洗牌列表中的给定索引处获取事实。当你用完时,选择一个新种子并重置索引。

答案 1 :(得分:0)

这就是我要做的事情:

n = 0 - Find a random fact
  add that fact to a new array (arr)
  display fact

n + 1 - Find a random fact
  check arr using lodash for that facts existence
  display or find a new fact, based on result of above

- 或 -

你可以拿arr并使用lodash的_.shuffle()来混合它们并按顺序显示它们。

https://lodash.com/docs

我喜欢使用lodash进行收集和数组操作。