在c ++中随机交换数组中的两个元素

时间:2016-02-05 15:45:40

标签: c++ arrays random

有没有办法在C ++中随机交换数组中的两个元素(两个不同的索引)?我的想法是随机选择第一个索引,然后随机选择第二个索引,直到第二个索引与第一个索引不同。然后交换这两个元素。我想知道有更好的办法吗?

我认为这与random_shuffle不同,因为每次我只想交换数组中的两个元素并保持其他元素保持原始顺序。

2 个答案:

答案 0 :(得分:7)

是的,从First[0...N-1]Second选择两个号码[0..N-2]。如果First< = Second,则++Second Second [0...First-1][First+1...N-1]结束。无需重试。

示例:假设您N=10 First 0-9First=5开始运行。想象一下,你选择Second。您知道还有9个元素可供选择0-4,即6-90-8。您现在选择一个数字5-8,然后通过添加一个将可能结果的子范围6-9映射到<=

First!=Second很重要。如果你只增加1 try sIntValue := FormatFloat('#,###', trunc(abs(Number))); sDecValue := Copy(FormatFloat('.#########', frac(abs(Number))), 2); if (Pos('E', sIntValue) > 0) then // if number is too big begin Result := 'ERROR:'; exit; end; except Result := 'ERROR:'; exit; end; ,那么交换5和6的几率会增加一倍,交换5和9的几率将是0%。

答案 1 :(得分:0)

这是一种基于@MSalters建议的解决方案:

int first = randInt(myArray.size()-1);
int second = randInt(myArray.size()-1);
while (first == second) {
    second = randInt(myArray.size()-1);
}
char firstLetter = letters[first];
char secondLetter = letters[second];
myArray[first] = secondLetter;
myArray[second] = firstLetter;