问题:程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。从概率的角度说,我们希望得到没有重复的有序选择,其中每个选择出现的概率相等。
1.genknuth():算法依次考虑整数0,1,2,...,n-1,并通过一个适当的随机测试对每个整数进行选择。通过按序访问整数,可以保证输出结果是有序的。
2.gensets():一种解决方案是在一个初始为空的集合里面插入随机整数,直到个数足够,然后排序输出集合中的元素(利用C++中的set容器可以节省排序这一步骤)。
3.genshuffle():生成随机整数的有序子集的另一种方法是把包含整数0~n-1的数组的前m个元素打乱(通过交换数组中的元素),然后把前m个元素排序输出。
1.genknuth():算法依次考虑整数0,1,2,...,n-1,并通过一个适当的随机测试对每个整数进行选择。通过按序访问整数,可以保证输出结果是有序的。
2.gensets():一种解决方案是在一个初始为空的集合里面插入随机整数,直到个数足够,然后排序输出集合中的元素(利用C++中的set容器可以节省排序这一步骤)。
3.genshuffle():生成随机整数的有序子集的另一种方法是把包含整数0~n-1的数组的前m个元素打乱(通过交换数组中的元素),然后把前m个元素排序输出。
4.genfloyd():当m接近n时,基于方法2的方法要丢掉很多随机数,给出一个算法使得在m个步骤之内就可以按要求等概率地生成有序随机数。
// generate m sorted integers in U[0,n)
#include
#include
#include
// find() sort()
using namespace std;
int bigrand()
{
return RAND_MAX*rand()+rand();
}
int randint(int l, int u)
{
return l+rand()%(u-l+1);
}
int genknuth(int m, int n)
{
int select=m, remain=n, i;
for(i=0;i
S; //
set
::iterator i; // while(S.size()
S; set
::iterator i; int k, j; for(k=n-m;k