如何在区间[0,n-1]中生成k个唯一随机数?
我使用了以下代码:
for( int i = 0 ; i < n ; ++i ){
a[i]=i;
}
std::random_shuffle( a, a+n ) ;
for(int i=0;i<k;++i){
ra[i]=a[i];
}
采用前k个元素。
有人能推荐我更快的方法吗?
的std :: random_shuffle: http://www.cplusplus.com/reference/algorithm/random_shuffle/
答案 0 :(得分:1)
对于n
的小值,您的方法非常适合。当然,您可以手动混合数组的元素,但这不太可能更快。
对于较大的值,您可以使用Linear Congruential Generator:
r[n + 1] = (a * r[n] + c) % m;
m
(模数)等于n
。
为了最大化生成序列的长度,您应该在选择值a
和c
时遵循一些规则(有关详细信息,请参阅上面的链接)。
当然,k
应该小于n
。