避免在列表中选择相同的随机单词,直到列表用完为止

时间:2014-10-02 06:52:29

标签: dart

此功能选择一个随机单词而不连续两次重复单词。

如何改进它,以便在列表用完之前不会选择相同的单词,即它已经遍历整个列表?

  animateRandomWords() {
    List words = ['changemakers', 'community organizers', 'lovers', 'doers', 'movers and shakers', 'collaborators', 'the crazy ones'];
    var rnd = new Random();
    randomWord = words[rnd.nextInt(words.length)];
    Timer timer = new Timer.periodic(new Duration(seconds: 4), (f) {
      HtmlElement el;
      el = $['random-word'];
      el.style.opacity = '0';
      new Timer(new Duration(milliseconds: 750), () {
        el.style.opacity = '1';
        var newWord;
        do {
          newWord = words[rnd.nextInt(words.length)];
        } while (newWord == randomWord);
        randomWord = newWord;
      });
    });
  }

2 个答案:

答案 0 :(得分:3)

另一种方法是将单词列表混洗,然后简单地遍历它。

Collections package实现List shuffle,虽然我不知道它使用了什么算法,但我希望它是Fisher-Yates的良好实现。

答案 1 :(得分:0)

我尝试了其他答案中建议的其他方法,然后选择了洗牌,迭代,再次洗牌等等。这是足够好但有一点需要注意:仍然有可能重复,即当重新洗牌的列表中的第一项与先前洗牌列表中的最后一项匹配时。唉,这是一个更高级的主题。

  animateRandomWords() {
    List words = ['changemakers', 'community organizers', 'lovers', 'doers', 'movers and shakers',
      'collaborators', 'the crazy ones', 'makers', 'builders', 'world changers', 'us', 'we vs. me'];
    words.shuffle(new Random());

    var randomWord = words[0]; // Initial random word.
    var i = 1; // Because we already used the first word, start iterating at the second.

    Timer timer = new Timer.periodic(new Duration(seconds: 4), (f) {
      HtmlElement el;
      el = $['random-word'];
      el.style.opacity = '0';

      new Timer(new Duration(milliseconds: 750), () {
        el.style.opacity = '1';
        if (i == words.length) {
          i = 0;
        }
        randomWord = words[i];
        print(randomWord);
        i++;
      });
    });
  }

我很想学习如何进一步改进/简化。