我想创建一个函数,生成一个随机数列表,其中包含用户插入的大小,以便在这些randoms上应用一些排序算法,为什么此代码不运行..plz help
vector<int> DataList;
int GenerateRandomList(int min, int max, int size)
{
srand ( time(NULL) );
for(int i=0;i<size;i++)
{
DataList[i]=rand()% max+min;
cout<<DataList[i];
cout<<endl;
}
}
答案 0 :(得分:4)
您的矢量为空,您无法分配给不存在的元素。
只需将DataList[i] = ...
替换为DataList.push_back(...)
即可。
此外,rand() % max + min
无法执行您想要的操作,因为max - min + 1
和min
(包括)之间只有max
个数字。 rand() % (max - min + 1) + min
应该有用。
此外,srand
应在main
开头调用一次,然后再调用一次。否则,如果连续两次调用GenerateRandomList
,则可能会得到相同的数字序列。
另外,为什么声明函数返回int
?您应该将其更改为void
或std::vector<int>
并返回刚刚生成的数字,而不是具有全局向量。
答案 1 :(得分:1)
执行此操作的好方法是使用std::generate
。链接页面上的示例涵盖了您的问题。
在您的特定情况下,您必须使用仿函数:
struct GenerateRandomList {
GenerateRandomList(int min, int max)
: min(min), max(max)
{
srand(time(NULL));
}
int operator()() const {
// this is courtesy of @FredOverflow's answer
return rand() % (max - min + 1) + min;
}
private:
int min;
int max;
};
// for generating
std::vector<int> DataList(10);
std::generate(DataList.begin(), DataList.end(), GenerateRandomList(10, 20));
您可以看到一个有效的例子here。这种方法的优点是,您可以为任何类型的容器(数组,列表,向量,集合)生成随机数。
答案 2 :(得分:0)
我认为你的问题是你想做push_back(int)而不是做DataList [i] = rand()%max + min;。以下代码编译并完成我认为您正在尝试做的事情。
#include <vector>
#include <stdlib.h>
#include <iostream>
using namespace std;
vector<int> DataList;
int GenerateRandomList(int min, int max, int size) {
srand ( time(NULL) );
for(int i=0;i<size;i++) {
DataList.push_back(rand()% max+min);
cout<<DataList[i];
cout<<endl;
}
}
int main() {
GenerateRandomList(0,15,10);
}