【问题标题】:count random without duplicate随机计数,不重复
【发布时间】:2013-11-22 20:34:03
【问题描述】:

我正在寻找没有重复数字的随机计数 我发现这样的东西没有评论随机

        var randnums = [0,1,2,3,4,5,6];

        setInterval(function() {
            var m = Math.floor(Math.random()*randnums.length);
            $('ul li:nth-of-type('+(randnums[m])+')').animate({
                opacity:1
            },400)
            console.log(randnums[m])
        }, 300);

示例CODEPEN

我想要完成的事情:

  • 当您检查控制台日志时,您会发现 random 没有像我想的那样工作。 我认为随机应该工作例如 4,3,5,1,6,2,每个数字的间隔为 300。 现在它像每 300 毫秒一样工作,选择数字 1、2、2、4、5、0 等,所以 4 秒后你看不到例如 1。

  • 第二个想法是我想创建一个脚本来计算元素的长度。元素的长度 (li) 然后创建数组并选择不重复的随机数。

我在网上找了很长时间的帮助,没有任何积极的结果。

【问题讨论】:

  • 一个dup?
  • 我使用了那个,但它不起作用,如您在示例中看到的那样
  • 使用后好像忘记拼接randnums数组了……
  • 嗯,但是 splice 在这个脚本中什么都不做。或者我不明白这一点。当我用拼接插入线时,它只显示数组中的一个数字。所以请你帮我吗?:)

标签: javascript jquery html random


【解决方案1】:

测试一下:

var randnums = [0, 1, 2, 3, 4, 5, 6],
    delay = setInterval(function () {
        var m = Math.floor(Math.random() * randnums.length);
        console.log(randnums[m]);
        randnums.splice(m,1);
        if (!randnums.length) {
            clearInterval(delay);
        }
    }, 300);

splice() 是这个脚本的一个非常重要的部分,它“丢弃”了一个使用过的数字。我还添加了一个检查,当使用所有数字时,它会停止间隔。


编辑

您可以使用for 循环创建一个长度为 X 的数组,例如:

var randnums = [], n, len = 12;
for (n = 0; n < len; n++) {
   randnums.push(n);
}

【讨论】:

  • 确实如此。但是你能帮我做第二部分吗?当我有更多元素时,例如 12 'li' 当 13 个元素 [0,1,2,...,11 ,13] 等
  • @SzymonDziewoński 我已经更新了我的答案。顺便提一句。 “OP”是指原始海报,即您。
  • 也许我做错了什么,但是当我更改 var randnums 时,它在 console.log 中显示未定义,我想它应该返回 [0,1,2,...,11,12]
  • @SzymonDziewoński 那是我的错,我的代码中有错字。我现在已经更正了。代码创建[0, 1, 2, ... , 11],长度为12。
  • 是的,现在我看到它正在工作。你救了我的好朋友:)。我真的很感谢你在这个问题上花费的时间,非常感谢你:)我欠你一个!:)
【解决方案2】:

拼接的替代方案,如果你希望能够重用数组或循环动画,试试这个:

var randnums = [0,1,2,3,4,5,6];
randnums.sort(function(a,b) {return Math.random()-0.5;}); // "shuffle" the array
setInterval(function() {
    var n;
    randnums.push(n = randnums.shift()); // cycle the first element to the back
    // do something with n
},300);

【讨论】:

  • 我更喜欢“洗牌优先”的方法,但是这种洗牌功能真的很糟糕,并且会产生极其不均匀的分布结果。你应该改用 Fisher-Yates 之类的东西。
  • 这就是为什么“shuffle”在引号中的原因:p 这是随机的,但这就是你尝试在一行代码中随机播放的结果;)
  • 那么你应该向显然不知道这一点的 OP 说清楚。不要只喂他不可靠的代码。
  • 好吧,OP 需要“好的”随机性吗?特别是在 JavaScript 中,没有什么是值得信任的,我认为“足够好”的随机性确实足够好。
  • 也许他不需要,也许他需要。我的观点是,通过对他撒谎,你会从他那里得到这个决定,这使它成为一个糟糕的答案。另外,您知道如何改进代码,那么为什么不直接去做呢?它肯定不会伤害,不是吗?而且,如果您更喜欢将糟糕的代码放在那里,至少要提及它实际上不会提供均匀分布。
猜你喜欢
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 2010-11-16
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
相关资源
最近更新 更多