为什么以下"交换"操作会在随机时间失败?
int i,p,a[11] = {0,1,2,3,4,5,6,7,8,9,10 };
srand(time(0));
for (i=0;i<11;i++)
{
p = rand() % 11;
a[i] = a[i] ^ a[p];
a[p] = a[i] ^ a[p];
a[i] = a[i] ^ a[p];
}
Run Code Online (Sandbox Code Playgroud)
它与这个答案中的逻辑没那么不同
它将适用于3/4运行然后开始复制0
用C和C++试过,结果相同
[编辑]
通过初始化p=0和替换相关的行来解决while (p==i) p = rand() % 11;
更新:不使用 的原因xor(参见Mark Byers的回答和评论)
如果p恰好相同i,那么a[i] ^ a[p]将为零,并且函数的其余部分失败.
从统计上来说,您的代码实际上有65%的可能性以这种方式失败.
确保在生成时p,它与数字不同i.例如:
p = rand() % 10;
if( p >= i) p++;
Run Code Online (Sandbox Code Playgroud)
当i等于p然后a[i] ^ a[p] 变为零.您的"交换"操作被破坏了.
要交换你应该使用一个临时变量:
int temp = a[i];
a[i] = a[p];
a[p] = temp;
Run Code Online (Sandbox Code Playgroud)
不要使用XOR黑客.