请问各位大佬有没有比较快的将排好的数列随机打乱的算法

学术版

对于 $n$ 个数的数列,考虑产生伪随机数 $r (r \leq n)$,每次交换 $x$ 号位 和 $r$ 号位上的数
by littlefrog @ 2021-05-09 12:57:12


有函数:random_shuffle
by loveJY @ 2021-05-09 12:58:28


```cpp for(int i=1;i<=n;i++) swap(a[i],a[rand()%(i-1)+1]); ``` 就是对于每一个数都跟前面的某一个数交换一下
by 江户川·萝卜 @ 2021-05-09 12:59:54


你可以用一个指针head指向开头,然后在它后面选一个随机数,选完和head所在位置的元素交换。再把head加1
by 零殇 @ 2021-05-09 13:06:22


顺便捞个帖子https://www.luogu.com.cn/discuss/show/315430
by littlefrog @ 2021-05-09 13:07:24


@[零殇](/user/299783) 但是他说了指针链表一类的不行
by littlefrog @ 2021-05-09 13:08:01


@[littlefrog](/user/175567) 火速捞??? 您的帖子还在主页耶。。。
by BorisDimitri @ 2021-05-09 13:15:22


@[BorisDimitri](/user/298208) 刚才晶状体出了点问题,现在已解决
by littlefrog @ 2021-05-09 13:27:11


@[fffngzzh](/user/345401) 简单点,for (i=1到n),每次产生一个1到i-1中间的随机数j,交换a[i]和a[j]就行了 楼上有人提到了`std::random_shuffle`,这是头文件algorithm里的函数,但自C++14起被弃用(deprecated),C++17起被移除(removed)。具体原因和使用方法详见[cppreference](https://en.cppreference.com/w/cpp/algorithm/random_shuffle)。这个函数有一些问题,但是对于算法竞赛来说是OK的,可以放心使用。
by GKxx @ 2021-05-09 13:57:28


@[littlefrog](/user/175567) @[GKxx](/user/72071) @[零殇](/user/299783) @[loveJY](/user/76990) @[江户川·萝卜](/user/258085) 感谢各位大佬的指导!
by fffngzzh @ 2021-05-10 12:51:28


|