【问题标题】:Random data in array without repeat数组中的随机数据不重复
【发布时间】:2014-11-30 01:40:10
【问题描述】:

我对这个code 有疑问 我只是想知道是否有办法在循环结束时不重复数组。

HTML:

<div id="words" class="word"></div>  
<button>word</button>

Javascript:

$(function () {
    var data = {"seed": [
            {
                "num1":"title1",
                "num2":"title2",
                "num3": [ "1","2","3" ]
            },
            {
                "num1":"title3",
                "num2":"title4",
                "num3": [ "a","b","c" ]
            },
            {
                "num1":"title5",
                "num2":"title6",
                "num3": [ "d","gh","34" ]
            }
    ]};
    var conta = data.seed.length;
    var recorre = data.seed;
    //alert(conta);

    function getNumbers() {
        var jokeId = Math.floor((Math.random()*conta));
        var joke = $('.word');
        var result = data.seed[jokeId].num3;
        var categ = data.seed[jokeId].num1;
        joke.empty()
        for (var c in result) {
            var newElement = document.createElement('div');
            newElement.id = result[c];  
            newElement.innerHTML = result[c]; 
            joke.append(newElement);
        }
    }

    $( "button" ).click(function() {
        getNumbers();
    });
});

【问题讨论】:

  • 查找“Fisher-Yates Shuffle”
  • 数组在循环结束时不重复是什么意思?
  • @MitchWheat 是正确的,但使用 Fisher-Yates 改组原理的方法不止一种。我在回答中给出了两个选项,并考虑了主动洗牌与懒惰洗牌。

标签: javascript jquery html arrays random


【解决方案1】:

一个选项:先随机播放

@MitchWheat 在上面的 cmets 中提供了一个很好的线索。提前改组数据是一种选择:

  1. 使用 Fisher-Yates shuffle 随机播放 data
  2. 每次点击按钮,只需遍历data 并显示下一个按钮。
  3. 当你到达终点时,重新洗牌。

FWIW:Fisher-Yates shuffle 很容易实现...类似于:

function shuffle(arr) {
  var i, j, a, b;
  for(i = arr.length - 1; i <= 1; i--) {
     j = Math.floor(Math.random() * i);
     a = arr[i];
     b = arr[j];
     arr[i] = b;
     arr[j] = a;
  }
}

第二个选项:延迟随机播放

把你已经用过的splice() 去掉:

  1. data复制到另一个数组copy
  2. 点击时:
    1. 选择一个随机索引copy
    2. 通过var item = copy.splice(randomIndex, 1) 获取
    3. 显示项目
    4. 当你到达终点时,再次将data 复制到copy

实际上,您有点在这里以一种懒惰的方式进行 Fisher-Yates 洗牌。因为您从整个数组开始,选择一个随机值并将其拉出(而不是交换它),然后将大小减少 1,而不是减少 i

【讨论】:

    猜你喜欢
    • 2016-05-05
    • 2014-05-18
    • 2011-05-21
    • 1970-01-01
    • 2021-12-25
    • 2018-07-03
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多