为什么下面的“交换”操作会在随机时间失败?
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];
}它与这个答案中的逻辑并没有太大的不同。
它将运行3/4,然后开始复制0。
在C和C++中试用,结果是一样的
编辑
通过初始化p=0并用while (p==i) p = rand() % 11;替换相关行来解决
更新: 不使用的理由 xor (见马克·拜尔斯的回答和注释)
发布于 2012-07-03 19:26:58
如果p碰巧与i相同,那么a[i] ^ a[p]将为零,而函数的其余部分将失败。
从统计数据来看,您的代码实际上有65%的可能性以这种方式失败。
确保在生成p时,它不是与i相同的数字。例如:
p = rand() % 10;
if( p >= i) p++;发布于 2012-07-03 19:26:48
当i等于p时,a[i] ^ a[p]变为零。你的“交换”操作失败了。
要进行交换,您应该使用一个临时变量:
int temp = a[i];
a[i] = a[p];
a[p] = temp;不要使用异或黑客。
发布于 2012-07-03 19:27:00
因为p随机等于i。在这种情况下,a[i]立即变为0。
https://stackoverflow.com/questions/11317767
复制相似问题