【问题标题】:Generating Unique Random Numbers in C++在 C++ 中生成唯一的随机数
【发布时间】:2019-02-08 02:58:33
【问题描述】:

这里是 C++ 初学者。我在下面有这段代码。不仅如此,但这是我需要帮助的部分。我需要生成随机数( 0 - 9 )并将其推回向量中。我希望这些随机数是唯一的。我怎么做? 另外,我不能使用 std::find(std::begin(vector),std::end(vector),a)。 非常感谢大家。

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {

  int digit = 0;
  int randNo = 0;
  cin >> digit;       
  srand((unsigned)time(NULL));
  vector <int> randG(digit);
            for(int i = 0; i < randG.size(); i++){
                    randNo = rand() %10;
                    randG.at(i) = randNo;
            }
  }

【问题讨论】:

  • 警告:使用rand() is highly problematic,我们强烈建议您使用合适的random number generator facility in the Standard Library,以产生高质量的随机值。您使用time(NULL) 作为随机数种子意味着如果在同一秒内运行,这将产生相同的结果,并且在许多平台上rand()barely random at all
  • 对此的常见解决方案是使用 Fisher-Yates Shuffle。可以在this documentation page for std::iota 的底部找到如何在 C++ 中执行此操作的示例
  • 我认为我的老师不允许我使用它。对不起。你能告诉我如何使用简单的 for 或 while 循环来做到这一点吗?谢谢。
  • 有几种方法可以做到这一点,shuffle() 是最惯用的。但是,当您刚开始使用 C++ 并了解 vector 时,一种简单但效率低下的方法是获取 0 到 9 之间的随机数。测试它是否存在于您的向量中。如果不是push_back 那个号码。重复直到所有 10 个数字都在您的向量中。更好的方法是创建一个元组向量,其中第一个元素的范围从 0 到 9,然后在第二个元素中添加一个随机数。然后根据第二个向量对向量进行排序。效率更高。只是学习的方法。然后做Fisher-Yates。

标签: c++ random


【解决方案1】:

如果您不太关心效率,并且希望在不替换 {a,a+1,...,b} 的情况下均匀采样,您可以创建一个vector&lt;int&gt; vstart,其中vstart[i]=a+i。之后,如果你想要k个样本并将它们存储在v_samples中,在[0,v.size())中生成一个随机数numrand,将vstart[numrand]推入vsamples,并从vstart中删除采样条目(删除对应于“不替换”部分),重复此k次。删除可能代价高昂,因此改组 vstart 并选择改组向量的前 k 个条目。

洗牌时要小心,因为您可能不会得到统一的洗牌:https://www.i-programmer.info/programming/theory/2744-how-not-to-shuffle-the-kunth-fisher-yates-algorithm.html。最好的方法是使用 &lt;algorithm&gt; 库中的 shuffle 函数:http://www.cplusplus.com/reference/algorithm/shuffle/,或者自己编写一个经过验证的 shuffle(Knuth shuffle 是这个问题的经典解决方案)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    相关资源
    最近更新 更多