算法练习-随机数(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;
}
参考资料:《编程珠玑》