Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中生成唯一的随机数+;_C++_Random - Fatal编程技术网

C++ 在C+中生成唯一的随机数+;

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

这里是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;
            }
  }
#包括
#包括
#包括
#包括
使用名称空间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。