有没有办法在C++中随机交换数组中的两个元素(两个不同的索引)?我的想法是随机选择第一个索引,然后随机选择第二个索引,直到第二个索引与第一个索引不同.然后交换这两个元素.我想知道有没有更好的方法呢?
我认为这与random_shuffle不同,因为每次我只想交换数组中的两个元素并保持其他元素保持原始顺序.
是的,选择两个号码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.你知道有9个元素可供选择Second,即0-4和6-9.您现在选择一个数字0-8,并通过添加一个5-8来映射可能结果的子范围6-9.
<=很重要 如果你只添加了1 First!=Second,那么交换5和6的几率会增加一倍,交换5和9的几率将是0%.