有没有办法在C ++中随机交换数组中的两个元素(两个不同的索引)?我的想法是随机选择第一个索引,然后随机选择第二个索引,直到第二个索引与第一个索引不同。然后交换这两个元素。我想知道有更好的办法吗?
我认为这与random_shuffle不同,因为每次我只想交换数组中的两个元素并保持其他元素保持原始顺序。
答案 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-9
从First=5
开始运行。想象一下,你选择Second
。您知道还有9个元素可供选择0-4
,即6-9
和0-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;