【问题标题】:Randomly swap two elements in an array in c++在c ++中随机交换数组中的两个元素
【发布时间】:2016-05-15 15:56:39
【问题描述】:

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

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

【问题讨论】:

  • @ZigZagZebra 好主意!:)
  • 你能说一下这是什么意思吗?选择更好的方法可能部分取决于这种随机交换旨在帮助您做什么。
  • 这是一次性的吗?

标签: c++ arrays random


【解决方案1】:

是的,从[0...N-1] 中选择两个数字First 和从[0..N-2] 中选择Second。如果First Second 则++Second 所以Second[0...First-1][First+1...N-1] 结束。无需重试。

示例:假设您有N=10,所以First 运行于0-9 包括在内。想象一下你选择First=5。你知道有 9 个元素可供选择 Second,即 0-46-9。您现在选择一个数字0-8,并通过加一将可能结果的子范围5-8 映射到6-9

<= 很重要。如果First!=Second只加1,5和6互换的几率会翻倍,5和9互换的几率是0%。

【讨论】:

  • 为什么是First <= Second 而不是First == Second
  • 如何从 [0...N-1] 中选择第一个,从 [0...N-2] 中选择第二个。 if First == Second, ++Second?
  • @ZigZagZebra 不。这会在第一个之后结块,永远不会选择最后一个。我们实际上需要 if(second>=first) ++second;您的方式是,如果有 11 个元素,则有 20% 的机会交换连续条目。
  • 假设你有 N=10 所以First0-9 运行。想象一下,您选择了 5。您知道还有 9 元素可以从中选择 Second0-46-9。您现在选择一个数字 0-8 并通过添加一个将子范围 5-8 映射到 6-9。如果你用!=,5和6互换的几率会翻倍,5和9互换的几率是0%。
  • @MSalters 我明白了。谢谢!
【解决方案2】:

这是基于@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;

【讨论】:

    猜你喜欢
    • 2013-06-17
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2015-10-02
    相关资源
    最近更新 更多