C++ 在C+中生成唯一的随机数+;
这里是C++初学者。下面是我的代码。不止这些,但这是我需要帮助的地方。我需要生成随机数(0-9)并将其推回向量。我希望这些随机数是唯一的。我该怎么做? 另外,我不能使用std::find(std::begin(vector)、std::end(vector)、a)。 非常感谢大家C++ 在C+中生成唯一的随机数+;,c++,random,C++,Random,这里是C++初学者。下面是我的代码。不止这些,但这是我需要帮助的地方。我需要生成随机数(0-9)并将其推回向量。我希望这些随机数是唯一的。我该怎么做? 另外,我不能使用std::find(std::begin(vector)、std::end(vector)、a)。 非常感谢大家 #include <iostream> #include <vector> #include <cstdlib> #include <ctime> using names
#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;
}
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
整数位数=0;
int-randNo=0;
cin>>数字;
srand((无符号)时间(NULL));
向量randG(数字);
对于(int i=0;i
如果您不太关心效率,并且希望在不替换{a,a+1,…,b}的情况下进行统一采样,您可以创建一个向量vstart
,其中vstart[i]=a+i
。之后,如果需要k个样本并将其存储在v_samples
中,则在[0,v.size()
中生成一个随机数numrand
,将vstart[numrand]
推到vsamples
中,并从vstart
中删除采样条目(删除对应于“不替换”部分),重复此k次。删除可能代价高昂,因此将vstart
洗牌并拾取洗牌向量的前k个条目
洗牌时要小心,因为您可能无法获得统一的洗牌:。最好的方法是使用
中的洗牌功能,或者自己编写一个经过验证的洗牌程序(Knuth shuffle是解决此问题的经典解决方案)。如果您不太在意效率,并且希望在不替换源代码的情况下进行统一采样{a,a+1,…,b}您可以创建一个向量vstart
,其中vstart[i]=a+i
。之后,如果您需要k个样本并将它们存储在v_samples
中,则在[0,v.size()
中生成一个随机数numrand
,按vstart[numrand]
进入vsamples
,并从vstart
中删除采样条目(删除对应于“不替换”部分),重复此k次。删除可能需要花费高昂的成本,因此将vstart
混洗并拾取混洗向量的前k个条目
洗牌时要小心,因为可能无法获得统一的洗牌:。最好的方法是使用中的洗牌函数,或者自己编写一个经过验证的洗牌(Knuth shuffle是解决此问题的经典方法).警告:使用并强烈建议您使用适当的生成高质量随机值的方法。您使用time(NULL)
作为随机数种子意味着如果在同一秒内运行,并且在许多平台上运行rand()这个问题的通用解决方法是使用Fisher YATS DUFFLE。C++中的一个例子可以在下面找到。我不认为我的老师允许我使用它。对不起。你能告诉我如何使用简单的for while循环吗?谢谢。有几种方法可以做到这一点,<代码> SUffFLE()是最惯用的方法。但是,正如你刚开始C++的,但是知道<代码>矢量< /代码>一个简单的,如果效率低的方法是在0到9之间得到一个随机数。测试它是否存在于你的向量中。如果不是代码,PuxSubBuff<代码>那个数字。重复直到所有10个数字都在你的向量中。更好的方法是创建。一个元组向量,第一个元素范围为0到9,第二个元素为一个随机数。然后根据第二个元素对向量进行排序。效率更高。只需从中学习。然后进行Fisher-Yates。警告:使用,强烈建议您使用适当的方法来生成高质量的随机值。时间(NULL)
作为一个随机数种子意味着如果在同一秒内运行,并且在许多平台上运行,这将产生相同的结果rand()这个问题的通用解决方法是使用Fisher YATS DUFFLE。C++中的一个例子可以在下面找到。我不认为我的老师允许我使用它。对不起。你能告诉我如何使用简单的for while循环吗?谢谢。有几种方法可以做到这一点,<代码> SUffFLE()是最惯用的方法。但是,正如你刚开始C++的,但是知道<代码>矢量< /代码>一个简单的,如果效率低的方法是在0到9之间得到一个随机数。测试它是否存在于你的向量中。如果不是代码,PuxSubBuff<代码>那个数字。重复直到所有10个数字都在你的向量中。更好的方法是创建。一个元组向量,第一个元素范围为0到9,第二个元素为一个随机数。然后根据第二个元素对向量进行排序。效率更高。只是学习的方法。然后做Fisher-Yates。