【问题标题】:Use entire list in pseudo-random number generation [duplicate]在伪随机数生成中使用整个列表
【发布时间】:2012-11-11 01:32:57
【问题描述】:

可能重复:
Pseudo-Random Traversal of a Set

我正在尝试编写一种算法,将播放列表中的歌曲按随机顺序排列,因此如果有 10 首歌曲,我需要随机数生成器在重复之前命中 0-9 的每个值。使用算法:x_current = (a * x_prev + c) mod m,有没有什么方法可以通过cm 的某些值来实现这一点?

【问题讨论】:

  • 你看过std::random_shuffle吗? (以及 C++11 中的 std::shuffle 吗?)
  • 你想要的不是随机数列表,而是将随机选择的歌曲列表条目交换一定次数。

标签: c++ algorithm list random


【解决方案1】:

尝试使用std::random_shuffle

 vector<int> playOrder;    

  // set some values:
  for (int i=1; i<10; ++i) playOrder.push_back(i); // 1 2 3 4 5 6 7 8 9

  // Don't forget to seed, or mix will be the same each run
  srand(time(NULL)); 

  // using built-in random generator:
  random_shuffle ( playOrder.begin(), playOrder.end() );

  // An example of how you might use the new random array.
  for(int i=0; i<playOrder.size(); i++)
    player.PlayTrack(playOrder[i]);

【讨论】:

  • 或者只是 std::shuffle,使用来自 &lt;random&gt; 的引擎。
【解决方案2】:

看看this question。此外,对于小型播放列表,只需用歌曲编号随机排列一个数组就足够了。

【讨论】:

  • “Simply shuffling an array”是问题描述。
  • 随机顺序遍历集合而不重复是问题描述。对数组进行洗牌是一种可能的解决方案。
  • 你是对的;我只是建议您可能需要从问题描述稍微进一步,以便 OP 将其识别为可能的解决方案。 :) 他提出的“算法”已经打算从本质上对数组进行洗牌,他正试图找到一种不同的方法来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2015-08-07
  • 1970-01-01
  • 2017-12-31
  • 2014-04-02
  • 1970-01-01
  • 2014-03-02
相关资源
最近更新 更多