2016-02-05 292 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