2015-02-08 82 views
1

如何在区间[0,n-1]中生成k个唯一的随机数?在区间[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

我不认为有一个更快的方法,除非你想在你选择的范围外生成数字 – smac89 2015-02-08 07:42:22

+0

可能的重复[在范围\ [0..n-1 \]范围内生成m个不同的随机数) (http://stackoverflow.com/questions/6947612/generating-m-distinct-random-numbers-in-the-range-0-n-1) – emlai 2015-02-08 07:50:52

回答

1

对于n你的方法的较小值是非常适合。当然,您可以手动混合阵列的元素,但这不太快。

对于较大的值,可以使用Linear Congruential Generator

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

m(模数)等于你n。 要最大化生成序列的长度,在选择值ac(请参阅上面的链接了解详细信息)时,应遵循一些规则。

当然,k应该小于n