算法练习-随机数(2)

续之前写过的随机数。之前n和k要相隔不大的情况下会产生碰撞,导致程序锁死。

看了编程珠玑的课后的答案,改进了一下。

具体思路是定义一个数组,并递增赋值。

再设置随机数种子,产生随机数。

并不是直接放入数组中。而是将产生的随机数作为下标即a[i + rand() % (n - i)]与a[i]交换位置。

我自己做了一个测试。

程序代码如下。

 

#include <cstdlib>
#include <ctime>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <functional>

using namespace std;

int n = 99999;
int k = 80000;
#define max 100000


void swap(int *a, int *b) {
 int tmp = *a;
 *a = *b;
 *b = tmp;
}
void produce(int *a, int n) {
 int i;
 //对数组a依次赋一个不同的值
 for (i = 0; i < n + 1; i++) {
  a[i] = i + 1;
 }
 srand((int)time(0));
 //下面的语句用于产生n个不同的随机数,存于数组的0到n-1位中
 // i + rand() % (n - i)产生一个范围i到n的随机数
 //那么将这个下标的数组数据和以i为下标的数组数据swap肯定不重复
 for (i = 0; i < n; i++)
 {
  swap(&a[i], &a[i + rand() % (n - i)]);
 }
}

int main()
{
 int *a = new int[max];
 produce(a, n);

 ofstream ocout;

 ocout.open("test.txt");

 sort(a, a + k);
 for (int i = 0; i < k; i++)
  ocout << a[i] << endl;
 //cout << a[i] << endl;
 return 0;
}

 

参考资料:《编程珠玑》

posted @ 2017-06-01 16:50  ll7  阅读(175)  评论(0编辑  收藏  举报