我有一个向量,我正在尝试填充随机数。我一直遇到一个问题,但是每次我运行它时,向量大多输出0(它不应该输出0)。我在下面编写的代码中做错了什么使它输出0(它输出0比任何其他数字更多):
vector<int> myVector;
srand((unsigned)time(NULL));
int a = rand() % 20 + 1; //1 to 20
for (int i =0; i < a; i++){
int b = rand() % 20 + 1;
myVector.push_back(b);
cout << myVector[b] << endl;
}
我是初学者,很长一段时间没有做太多的C ++编程,所以我不确定是什么让我的代码出现故障。如果有人能够解释我做错了什么,我们将不胜感激。
答案 0 :(得分:63)
您可以使用std :: generate算法用随机数填充n个元素的向量。
在现代C ++中,建议不要使用任何基于时间的种子和std :: rand,而是使用random_device来生成种子。对于基于软件的引擎,您始终需要指定引擎和分发。 Read More..
#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <functional>
using namespace std;
int main()
{
// First create an instance of an engine.
random_device rnd_device;
// Specify the engine and distribution.
mt19937 mersenne_engine {rnd_device()}; // Generates random integers
uniform_int_distribution<int> dist {1, 52};
auto gen = [&dist, &mersenne_engine](){
return dist(mersenne_engine);
};
vector<int> vec(10);
generate(begin(vec), end(vec), gen);
// Optional
for (auto i : vec) {
cout << i << " ";
}
}
如果您想以随机顺序重新排列范围的元素:
std::shuffle(begin(vec), end(vec), mersenne_engine);
答案 1 :(得分:5)
您在向量中调用了错误的索引
尝试做:
cout << myVector[i] << endl;
否则你将冒险在前20次左右的迭代中跑掉你的顶点。
您也可以在矢量上调用.back()以获取矢量中的最后一项。
答案 2 :(得分:5)
只需添加我的2美分...此响应类似于Marko Tunjic给出的响应,但它不使用C中的std::rand
,而是使用C ++ 11功能。
它允许您在下面的示例中使用您选择的分布uniform_int_distribution
。
#include <algorithm>
#include <iostream>
#include <limits>
#include <random>
#include <vector>
static std::vector<int> generate_data(size_t size)
{
using value_type = int;
// We use static in order to instantiate the random engine
// and the distribution once only.
// It may provoke some thread-safety issues.
static std::uniform_int_distribution<value_type> distribution(
std::numeric_limits<value_type>::min(),
std::numeric_limits<value_type>::max());
static std::default_random_engine generator;
std::vector<value_type> data(size);
std::generate(data.begin(), data.end(), []() { return distribution(generator); });
return data;
}
int main()
{
for (auto i = 0u; i < 5; ++i)
{
std::vector<int> myVector = generate_data(10);
myVector = generate_data(10);
std::cout << "myVector (iteration " << i << "): ";
for (auto v: myVector)
{
std::cout << v << ",";
}
std::cout << "\n";
}
}
答案 3 :(得分:5)
简单地说:
std::vector<int> v(1000);
std::generate(v.begin(), v.end(), std::rand);
答案 4 :(得分:1)
您在向量中调用了错误的索引
cout << myVector[i] << endl;
答案 5 :(得分:1)
目前还不清楚你要对循环做什么,代码创建一个随机大小的向量,填充随机数。
您正在输出“myVector [b]”,但“b”是随机值,而不是刚刚添加的数字的索引。你可以:
cout << b << endl;
但实际上你应该调整矢量大小,只需按索引访问。
int vec_size = rand() % 20 + 1;
vec<int> myvec(vec_size);
for( int i = 0; i < vec_size; ++i ) {
vec[i] = rand() % 20 + 1;
}
/* output the list after you made it */
std::copy(myvec.begin(), myvec.end(),
std::ostream_iterator<int>(cout, "\n"));
答案 6 :(得分:-1)
// here I generate a vector that contains random vectors
// for example, after this code, vec = { {1,4,8}, {1,3,6,7,9}, {2,5,6} }
#include <vector>
#include <time.h>
void generate_random_vectors(const int num_of_rand_vectors, vector<vector<int>> &vec) {
for (int j = 0; j < num_of_rand_vectors; ++j) {
// the vector size will be randomal: between 0 to 19
int vec_size = (rand() % 20);
vector<int> rand_vec(vec_size);
for (int k = 0; k < vec_size; ++k) {
// each vec element will be randomal: between 1 to 20
rand_vec[k] = 1 + (rand() % 20);
}
// each vector will be sorted if you want to
sort(rand_vec.begin(), rand_vec.end());
// push each of the 'num_of_rand_vectors'-th vectors into vec
vec.push_back(rand_vec);
}
}
void main() {
srand(static_cast<unsigned int>(time(NULL)));
// input vector containing random sorted vectors
vector<vector<int>> vec;
generate_random_vectors(3, vec);
}
答案 7 :(得分:-2)
cout << myVector[b] ?!
应该是:cout << myVector[i];