2016-02-05 288 views
0

有什麼方法可以在C++中隨機交換數組中的兩個元素(兩個不同的索引)?我的想法是隨機挑選第一個索引,然後隨機挑選第二個索引,直到第二個索引與第一個索引不同。然後交換這兩個元素。我想知道有沒有更好的方法來做到這一點?在C++中隨機交換數組中的兩個元素

我認爲這不同於random_shuffle,因爲每次我只想交換數組中的兩個元素,並保持其他人在原始順序。

+0

@ZigZagZebra一個好主意!:) –

+1

你能說這是什麼意思嗎?選擇一種更好的方式可能部分取決於這種隨機互換是爲了幫助你做什麼。 –

+0

這是一次性的事嗎? – NathanOliver

回答

6

是的,從[0...N-1]Second[0..N-2]中挑選兩個數字First。如果First < = Second++Second因此Second結束於[0...First-1][First+1...N-1]。不需要重試。

示例:假設您有N=10,所以First0-9開始運行。想象一下你選擇First=5。你知道還有9個元素可以選擇Second,即0-46-9。您現在選擇一個數字0-8,並通過添加一個映射可能結果的子範圍5-86-9

<=很重要。如果只添加1,如果First!=Second,交換5和6的機會將是雙倍,交換5和9的機會將爲0%。

+1

爲什麼'First <= Second'而不是'First == Second'? –

+0

如何從[0 ... N-1]中選擇First,然後從[0 ... N-2]中選擇第二個。如果First == Second,++ Second? – ZigZagZebra

+0

@ZZZZZZRA號碼在第一個之後會聚集,從不選擇最後一個。我們實際上需要if(second> = first)++秒;你的方式是,如果有11個元素,則有20%的機會交換連續的條目。 – Persixty