【发布时间】: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。