在区间[0,n-1]中生成k个唯一随机数

Generate k unique random numbers in the interval [0,n-1]?

本文关键字:随机数 唯一 区间 n-1      更新时间:2023-10-16

如何在区间[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/

对于n的小值,您的方法非常适合。当然,您可以手动混合数组的元素,但这不太可能快得多。

对于较大的值,可以使用线性同余生成器:

r[n + 1] = (a * r[n] + c) % m;

其中m(模量)等于您的n。为了最大化生成序列的长度,在选择值ac时应该遵循一些规则(有关详细信息,请参阅上面的链接)。

当然,k应该比n小。