【发布时间】:2011-10-20 07:53:49
【问题描述】:
我有两种方法可以在 [0..n-1] 范围内生成 m 个不同的随机数
方法一:
//C++-ish pseudocode
int result[m];
for(i = 0; i < m; ++i)
{
int r;
do
{
r = rand()%n;
}while(r is found in result array at indices from 0 to i)
result[i] = r;
}
方法二:
//C++-ish pseudocode
int arr[n];
for(int i = 0; i < n; ++i)
arr[i] = i;
random_shuffle(arr, arr+n);
result = first m elements in arr;
当 n 远大于 m 时,第一种方法更有效,而第二种方法在其他情况下更有效。但是“更大”并不是一个严格的概念,是吗? :)
问题: 我应该使用 n 和 m 的什么公式来确定 method1 还是 method2 更有效? (就运行时间的数学期望而言)
【问题讨论】:
-
如果
m真的很小,那么效率有那么重要吗?针对更可能导致问题的情况进行优化。 -
@Mark:我会动态获取n和m。我将不得不确定运行时使用哪种方法
-
你用几个不同的参数测试过这两种方法吗?只是为了大致了解他们需要多长时间。
标签: c++ algorithm random performance