Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的随机生成算法+;_C++_Arrays_Algorithm_Random - Fatal编程技术网

C++ C+中的随机生成算法+;

C++ C+中的随机生成算法+;,c++,arrays,algorithm,random,C++,Arrays,Algorithm,Random,假设您需要生成前N个整数的随机排列。例如,{4,3,1,5,2}和{3,1,4,2,5}是合法排列,但{5,4,1,2,1}不是,因为一个数字(1)重复,而另一个数字(3)丢失。此例程通常用于算法的模拟。我们假设存在一个随机数生成器RandInt(i,j),它以相等的概率在i和j之间生成。以下是算法: 按如下方式将数组A从[0]填充到[N-1]:要填充[i],请生成随机数,直到得到一个不在[0]、A[1]、…、A[i-1]中的数 在C++中实现该算法,并发现其复杂性。这是我的代码: int a;

假设您需要生成前N个整数的随机排列。例如,{4,3,1,5,2}和{3,1,4,2,5}是合法排列,但{5,4,1,2,1}不是,因为一个数字(1)重复,而另一个数字(3)丢失。此例程通常用于算法的模拟。我们假设存在一个随机数生成器RandInt(i,j),它以相等的概率在i和j之间生成。以下是算法:

按如下方式将数组A从[0]填充到[N-1]:要填充[i],请生成随机数,直到得到一个不在[0]、A[1]、…、A[i-1]中的数

在C++中实现该算法,并发现其复杂性。这是我的代码:

int a;
bool b = false;
A[0] = RandInt(1,n);
for (int i=1;i<n;i++) {
do {
  b = false;
  a = RandInt(1,n);
  for (int j=0;j<i;j++)
     if(A[j] == a)
        b = true;
} while(b);
A[i] = a;
}
inta;
布尔b=假;
A[0]=RandInt(1,n);

对于(int i=1;i,此算法将产生正确的结果,从所有可能的置换中均匀随机地选择置换

运行时间不受任何确定性函数的限制,因为正如您所指出的,它可以永远运行。在最好的情况下,该算法以O(n^2)运行,并选择一个随机排列,而无需重复任何选择。平均而言,您需要尝试n/n=1次才能得到第一个唯一的随机数,n/(n-1)得到第二个的次数,依此类推,得到最后一个的期望值n/1=n次。将这些加在一起会得到n*H(n),其中H(n)是第n个谐波数。结果表明H(n)是θ(logn),所以这个算法在平均情况下是O(n^2 logn)

有一种更好的方法来完成您试图做的事情:您可以从任何排列开始,并使用最坏情况下为O(n)的算法将其重新排列到另一个排列中。该算法是Fisher-Yates算法,其工作原理如下:

FisherYates(array[1...n])
1. if n == 1 then return
2. r = random(2, n)
3. temp = array[1]
4. array[1] = array[r]
5. array[r] = temp
6. FisherYates(array[2...n])

这是一个递归公式,但迭代公式很简单。它精确地调用
random
n
,其中
n
是最高调用处数组的大小。

如果序列小于100000000个值:用序列中的值填充数组,并使用随机数对进行shuf通过交换值对数组进行fle。交换的次数至少与数组的大小相同。若要查看工作代码,请在代码查看上发布:@RichardCritten更好的方法是或
std::shuffle
,这保证了均匀分布,但OP仍然坚持使用一种他被告知要使用的技术。
shuffle
a vector feed by
iota
。生成随机数,然后添加到
std::set
,这将自动消除重复项。当
set
的大小达到所需值时,停止添加。对于复杂性,您需要考虑当
set
的大小增加时,拾取已拾取数字的概率。B但是我们不是在第二个循环中有1+2+3+…+n-1+n搜索在最好的情况下吗?不是O(n^2)?@Olionhysa你知道吗,你是对的。我错过了。这将在给出的每一个复杂度中添加一个术语
n
:最佳和平均情况。所以这些实际上是O(n^2)代表最好的情况,O(n^2 log n)代表平均情况。我道歉。