0

次の「スワップ」アクションがランダムに失敗するのはなぜですか?

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;

更新:使用しない理由 xorMark Byersの回答とコメントを参照)

4

5 に答える 5

6

pがたまたま同じでiある場合a[i] ^ a[p]、はゼロになり、関数の残りの部分は失敗します。

統計的に、コードは実際にはこの方法で失敗する可能性が65%あります。

pを生成するときは、。と同じ数ではないことを確認してくださいi。例えば:

p = rand() % 10;
if( p >= i) p++;
于 2012-07-03T19:26:58.023 に答える
5

i等しい場合はゼロpa[i] ^ a[p] なります。「スワップ」操作が壊れています。

交換するには、一時変数を使用する必要があります。

int temp = a[i];
a[i] = a[p];
a[p] = temp;

XORハックを使用しないでください。

于 2012-07-03T19:26:48.127 に答える
1

開発手法として、XORスワッピングは推奨されません。ただし、楽しみのためにロジックを使用している場合は、この行を使用して、pがiと同じにならないようにします。

p = ((rand()%10)+(i+1))%11;

また

p = ((rand()%(count-1))+(i+1))%count;

ただし、このトリックは2つのモジュール演算子と1つの加算(または減算)を必要とするため、パフォーマンスの観点からは適切ではないことに注意してください。正確な比較(これは最速の比較演算子です)を使用し、同じ場合は1を追加します。

p = rand()%10;
if (p == i) p++;
于 2012-07-03T20:43:54.943 に答える
1

pはランダムにに等しいからですi。この場合、a[i]瞬時に0になります。

于 2012-07-03T19:27:00.280 に答える
1

その場合i == pa[i]保存し0ます。

于 2012-07-03T19:27:49.843 に答える