首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++中创建随机数组

如何在C++中创建随机数组
EN

Stack Overflow用户
提问于 2012-08-28 05:05:33
回答 3查看 15.5K关注 0票数 3

有没有一种方法可以随机生成一个大的元素数组……10000,100000,甚至1000000个元素,然后使用我的插入排序算法,而不是元素是25。我正在尝试拥有一个大的元素数组,并使用插入排序来将它们放在顺序中,然后也按相反的顺序放置。接下来,我使用time.h文件中的clock()计算出每个算法的运行时间。我正在尝试用大量的数字进行测试。

代码语言:javascript
复制
#define ELEMENTS 25

void insertion_sort(int x[],int length);
void insertion_sort_reverse(int x[],int length);

int main()
{
  clock_t tStart = clock();
  int B[ELEMENTS]={4,2,5,6,1,3,17,14,67,45,32,66,88,
               78,69,92,93,21,25,23,71,61,59,60,30};
  int x;

  cout<<"Not Sorted: "<<endl;
  for(x=0;x<ELEMENTS;x++)
       cout<<B[x]<<endl;

   insertion_sort(B,ELEMENTS);
   cout <<"Sorted Normal: "<<endl;
  for(x=0;x<ELEMENTS;x++)
       cout<< B[x] <<endl;

  insertion_sort_reverse(B,ELEMENTS);
  cout <<"Sorted Reverse: "<<endl;
  for(x=0;x<ELEMENTS;x++)
       cout<< B[x] <<endl;

  double seconds = clock() / double(CLK_TCK);
  cout << "This program has been running for " << seconds << " seconds." << endl;
  system("pause");
  return 0;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-28 05:09:44

代码语言:javascript
复制
#include <random>     // mt19937 and uniform_int_distribution
#include <algorithm>  // generate
#include <vector>     // vector
#include <iterator>   // begin, end, and ostream_iterator
#include <functional> // bind
#include <iostream>   // cout

std::vector<int> create_random_data(int n) {
  std::random_device r;
  std::seed_seq      seed{r(), r(), r(), r(), r(), r(), r(), r()};
  std::mt19937       eng(seed); // a source of random data

  std::uniform_int_distribution<int> dist;
  std::vector<int> v(n);

  generate(begin(v), end(v), bind(dist, eng));
  return v;
}

int main() {
  auto random_data = create_random_data(100000);

  std::cout << "unsorted: ";
  copy(begin(random_data), end(random_data),
       std::ostream_iterator<int>(std::cout, "\n"));
}

generate是一种通用算法,它用函数器生成的值填充范围。在本例中,我们为它提供了一个函数器,该函数器使用我们的随机数据源来生成随机数,并且我们提供了一个与容器相对应的范围,在generate使用数据填充容器之后,我们可以使用该范围。

  • std::generate()
  • std::uniform_int_distribution
  • std::mt19937

我们使用std::mt19937std::uniform_int_distribution,作为C++11的标准C++工具(在VS2010中可用)来创建随机数,而不是旧的std::rand()std::srand(),因为新方法更容易正确使用,更高质量和更灵活。

如果您使用的是VS2012或更高版本,则可以使用C++11时间库。

代码语言:javascript
复制
#include <chrono>

int main() {
  using std::chrono::high_resolution_clock;
  using std::chrono::duration_cast;
  using std::chrono::nanoseconds;

  auto start = high_resolution_clock::now();

  // ...

  auto end = high_resolution_clock::now();

  std::cout << duration_cast<nanoseconds>(end - start).count() << "ns\n";
}

  • <chrono>
票数 18
EN

Stack Overflow用户

发布于 2012-08-28 05:10:46

而不是

代码语言:javascript
复制
void insertion_sort(int x[],int length);
void insertion_sort_reverse(int x[],int length);

 int B[ELEMENTS]={4,2,5,6,1,3,17,14,67,45,32,66,88,
           78,69,92,93,21,25,23,71,61,59,60,30};

试一试

代码语言:javascript
复制
void insertion_sort(std::vector<int>& x);
void insertion_sort_reverse(std::vector<int>& x);

 srand(NULL);
 std::vector<int> B(num_elements); //num_elements can be a variable
 std::generate(B.begin(), B.end(), rand);

与任务相关,而不是问题:

您将希望在一行中运行每个排序两次,第一次没有计时,第二次有计时。

你的测试是不公平的,因为一个是从随机的位置开始的,另一个是从排序的位置开始的。

您在计时中包含了IO,而IO总是很慢(cout)

使用'\n'std::endl会强制程序立即将所有输出提供给操作系统。

您显示的是一个完全不相关的秒数。

代码语言:javascript
复制
int main()
{
  srand(NULL);
  std::vector<int> B(num_elements); //num_elements can be a variable
  std::generate(B.begin(), B.end(), rand);
  std::vector<int> C(B); //make a copy of the data

  std::cout << "Not Sorted:" << '\n';
  for(int i=0;i<B.size();i++)
       cout<<B[i]<<'\n';

  clock_t tStart0 = clock();        
  insertion_sort(B,ELEMENTS);
  clock_t tStop0 = clock();     

  cout <<"Sorted Normal: "<<'\n';
  for(int i=0;i<B.size();i++)
       cout<< B[i] <<'\n';

  clock_t tStart1 = clock();        
  insertion_sort_reverse(C);
  clock_t tStop1 = clock();  

  cout <<"Sorted Reverse: "<<'\n';
  for(int i=0;i<C.size();i++)
       cout<< C[i] <<'\n';

  double seconds = (tStop1-tStart1 + tStop0-tStart0) / double(CLK_TCK);
  cout << "This program has been running for " << seconds << " seconds." << endl;
  system("pause");
  return 0;
}
票数 4
EN

Stack Overflow用户

发布于 2019-10-09 09:58:12

对于C++11,我使用时间值作为初始随机种子,以生成任意数量的随机数据。

请参阅以下示例代码

代码语言:javascript
复制
#include <iostream>
#include <random>
#include <chrono>
#include <functional>
#include <iterator>

constexpr auto MAX = 20;

int main(int argc, char* argv[]) {

    std::default_random_engine re(std::chrono::system_clock::now().time_since_epoch().count());
    std::uniform_int_distribution<int> uid(0, MAX);
    int nums[MAX] {};
    std::generate(nums, nums+MAX, std::bind(uid, re));

    // apply sort algorithm

    std::copy(nums, nums+MAX, std::ostream_iterator<int>(std::cout, ","));
    std::cout << std::endl;
    return 0;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12149593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档