在C++11里,可以通过以下代码来生成随机数列:
random_device rd;
mt19937 generator(rd());
uniform_int_distribution<int> dist(1,n);
for(i=1; i<=n-2; i++){
x[i]=dist(generator);
}
但是这样生成的随机数列似乎无法做到“真正随机”的效果,在本地实测时生成的总是同一个数列,但在洛谷IDE里却能给出不同的数列。
我认为这主要由
random_device rd;
是根据设备信息选择随机种子,而使用同一台设备将会一直是同一个随机数种子所致。
请问有无方法在本地实现真正的随机?
附:实验代码如下
#include <bits/stdc++.h>
using namespace std;
const int m=1000;
int main() {
random_device rd;
mt19937 generator(rd());
int x[m],y[m],n,i,j;
bool b[m];
scanf("%d",&n);
uniform_int_distribution<int> dist(1,n);
for(i=1; i<=n-2; i++) {
x[i]=dist(generator);
}
x[n-1]=n;
for(i=1; i<=n-1; i++) {
memset(b,0,sizeof(b));
for(j=1; j<=i-1; j++) {
b[y[j]]=1;
}
for(j=i; j<=n-1; j++) {
b[x[j]]=1;
}
for(j=1; j<=n; j++) {
if(!b[j]) {
y[i]=j;
break;
}
}
}
for(i=1; i<=n-1; i++) {
printf("%d %d\n",x[i],y[i]);
}
return 0;
}
效果图如下:

在本地运行时即使运行多次也只会给出这一种结果


在洛谷IDE上运行得到的两个不同结果